# -*- coding: utf-8 -*- """Fix UTF-8 Chinese in meat yield analysis files.""" import os ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) def write(rel_path, content): path = os.path.join(ROOT, rel_path.replace("/", os.sep)) os.makedirs(os.path.dirname(path), exist_ok=True) with open(path, "w", encoding="utf-8", newline="\n") as f: f.write(content) print("fixed:", rel_path) write( "ruoyi-admin/src/main/java/com/ruoyi/web/base/domain/vo/MeatYieldBatchVo.java", """package com.ruoyi.web.base.domain.vo; import com.fasterxml.jackson.annotation.JsonFormat; import lombok.Data; import java.math.BigDecimal; import java.util.Date; /** * \u6279\u6b21\u51fa\u8089\u7387\u6c47\u603b */ @Data public class MeatYieldBatchVo { /** \u5165\u573a\u6279\u6b21ID */ private Long entranceBatchId; /** \u5165\u573a\u6279\u6b21\u53f7\uff08\u6279\u6b21ID\u5b57\u7b26\u4e32\uff09 */ private String entranceBatchNo; /** \u6279\u6b21\u5165\u573a\u65f6\u95f4 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date entranceTime; /** \u6bdb\u91cd\uff08\u5165\u573a\u79f0\u91cd\u5408\u8ba1\uff0ckg\uff09 */ private BigDecimal grossWeight; /** \u51c0\u91cd\uff08\u5e38\u89c4\u751f\u4ea7\u79f0\u91cd\u5408\u8ba1\uff0ckg\uff09 */ private BigDecimal netWeight; /** \u5e73\u5747\u51fa\u8089\u7387\uff08%\uff09 */ private BigDecimal avgMeatYield; } """, ) write( "ruoyi-admin/src/main/java/com/ruoyi/web/base/domain/vo/MeatYieldDetailVo.java", """package com.ruoyi.web.base.domain.vo; import lombok.Data; import java.math.BigDecimal; /** * \u4e2a\u4f53\u51fa\u8089\u7387\u660e\u7ec6 */ @Data public class MeatYieldDetailVo { /** \u4e2a\u4f53\u7f16\u53f7 */ private String individualNo; /** \u6bdb\u91cd\uff08\u5165\u573a\u79f0\u91cd\uff0ckg\uff09 */ private BigDecimal grossWeight; /** \u51c0\u91cd\uff08\u5e38\u89c4\u751f\u4ea7\u79f0\u91cd\u5408\u8ba1\uff0ckg\uff09 */ private BigDecimal netWeight; /** \u51fa\u8089\u7387\uff08%\uff09 */ private BigDecimal meatYield; } """, ) write( "ruoyi-admin/src/main/java/com/ruoyi/web/base/domain/param/MeatYieldBatchQuery.java", """package com.ruoyi.web.base.domain.param; import lombok.Data; /** * \u6279\u6b21\u51fa\u8089\u7387\u5217\u8868\u67e5\u8be2\u53c2\u6570 */ @Data public class MeatYieldBatchQuery { private String orgId; /** \u5165\u573a\u5f00\u59cb\u65f6\u95f4 yyyy-MM-dd HH:mm:ss */ private String beginEntranceTime; /** \u5165\u573a\u7ed3\u675f\u65f6\u95f4 yyyy-MM-dd HH:mm:ss */ private String endEntranceTime; } """, ) write( "ruoyi-admin/src/main/java/com/ruoyi/web/base/mapper/MeatYieldAnalysisMapper.java", """package com.ruoyi.web.base.mapper; import com.ruoyi.web.base.domain.param.MeatYieldBatchQuery; import com.ruoyi.web.base.domain.vo.MeatYieldBatchVo; import com.ruoyi.web.base.domain.vo.MeatYieldDetailVo; import org.apache.ibatis.annotations.Param; import java.util.List; /** * \u51fa\u8089\u7387\u5206\u6790 Mapper */ public interface MeatYieldAnalysisMapper { List selectBatchList(MeatYieldBatchQuery query); List selectDetailList(@Param("orgId") String orgId, @Param("entranceBatchId") Long entranceBatchId); } """, ) write( "ruoyi-admin/src/main/java/com/ruoyi/web/base/service/IMeatYieldAnalysisService.java", """package com.ruoyi.web.base.service; import com.ruoyi.web.base.domain.param.MeatYieldBatchQuery; import com.ruoyi.web.base.domain.vo.MeatYieldBatchVo; import com.ruoyi.web.base.domain.vo.MeatYieldDetailVo; import java.util.List; /** * \u51fa\u8089\u7387\u5206\u6790 Service */ public interface IMeatYieldAnalysisService { List selectBatchList(MeatYieldBatchQuery query); List selectDetailList(String orgId, Long entranceBatchId); } """, ) write( "ruoyi-admin/src/main/java/com/ruoyi/web/base/controller/MeatYieldAnalysisController.java", """package com.ruoyi.web.base.controller; import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.framework.web.service.TokenService; import com.ruoyi.web.base.domain.param.MeatYieldBatchQuery; import com.ruoyi.web.base.domain.vo.MeatYieldDetailVo; import com.ruoyi.web.base.service.IMeatYieldAnalysisService; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import javax.servlet.http.HttpServletRequest; import java.util.List; /** * \u51fa\u8089\u7387\u5206\u6790 */ @RestController @RequestMapping("/meat-yield-analysis") public class MeatYieldAnalysisController extends BaseController { @Autowired private IMeatYieldAnalysisService meatYieldAnalysisService; @Autowired private TokenService tokenService; @ApiOperation("\u6279\u6b21\u51fa\u8089\u7387\u5217\u8868\uff08\u6309\u5165\u573a\u65f6\u95f4\u8303\u56f4\uff09") @GetMapping("/batch-list") public TableDataInfo batchList(MeatYieldBatchQuery query, HttpServletRequest request) { query.setOrgId(tokenService.getLoginOrgId(request)); startPage(); return getDataTable(meatYieldAnalysisService.selectBatchList(query)); } @ApiOperation("\u6279\u6b21\u51fa\u8089\u7387\u4e2a\u4f53\u660e\u7ec6\uff08\u6309\u5165\u573a\u6279\u6b21ID\uff09") @GetMapping("/detail-list") public TableDataInfo detailList(Long entranceBatchId, HttpServletRequest request) { String orgId = tokenService.getLoginOrgId(request); List list = meatYieldAnalysisService.selectDetailList(orgId, entranceBatchId); TableDataInfo data = getDataTable(list); data.setTotal(list.size()); return data; } } """, ) write( "ruoyi-ui/src/api/production/meatYieldAnalysis.js", """import request from '@/utils/request' /** \u6279\u6b21\u51fa\u8089\u7387\u5217\u8868\uff08\u5165\u573a\u65f6\u95f4\u8303\u56f4\uff09 */ export function listMeatYieldBatch(query) { return request({ url: '/meat-yield-analysis/batch-list', method: 'get', params: query }) } /** \u6279\u6b21\u4e2a\u4f53\u51fa\u8089\u7387\u660e\u7ec6\uff08\u5165\u573a\u6279\u6b21ID\uff09 */ export function listMeatYieldDetail(query) { return request({ url: '/meat-yield-analysis/detail-list', method: 'get', params: query }) } """, ) write( "sql/meat_yield_analysis_menu.sql", """-- \u51fa\u8089\u7387\u5206\u6790\u83dc\u5355\uff08\u7236\u83dc\u5355\uff1a\u751f\u4ea7\u7ba1\u7406 2176\uff09 INSERT INTO `sys_menu` (`menu_name`, `parent_id`, `order_num`, `path`, `component`, `query`, `route_name`, `is_frame`, `is_cache`, `menu_type`, `visible`, `status`, `perms`, `icon`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`) SELECT '\u51fa\u8089\u7387\u5206\u6790', 2176, 43, 'meatYieldAnalysis', 'production/meatYieldAnalysis/index', NULL, '', 1, 0, 'C', '0', '0', 'production:meatYieldAnalysis:list', 'chart', 'admin', NOW(), '', NULL, '' FROM DUAL WHERE NOT EXISTS ( SELECT 1 FROM `sys_menu` WHERE `path` = 'meatYieldAnalysis' AND `parent_id` = 2176 ); """, ) write( "sql/production_white_strip_regular_alter_individual_no.sql", """-- \u767d\u6761\u5e38\u89c4\u751f\u4ea7\u8868\u589e\u52a0\u4e2a\u4f53\u7f16\u53f7\u5b57\u6bb5\uff08\u51fa\u8089\u7387\u5206\u6790\u5173\u8054\u7528\uff09 ALTER TABLE `production_white_strip_regular` ADD COLUMN `individual_no` varchar(64) NULL DEFAULT NULL COMMENT '\u4e2a\u4f53\u7f16\u53f7' AFTER `pig_batch`; CREATE INDEX `idx_pig_batch_individual_no` ON `production_white_strip_regular` (`pig_batch`, `individual_no`); """, ) # Fix mapper XML comment only mapper_path = os.path.join(ROOT, "ruoyi-admin/src/main/resources/mapper/base/MeatYieldAnalysisMapper.xml") with open(mapper_path, "r", encoding="utf-8", errors="replace") as f: xml = f.read() bad_comment = "" # replace first garbled comment line after resultMap import re xml = re.sub( r"\s*", bad_comment + "\n ", xml, count=1, ) with open(mapper_path, "w", encoding="utf-8", newline="\n") as f: f.write(xml) print("fixed:", "ruoyi-admin/src/main/resources/mapper/base/MeatYieldAnalysisMapper.xml") print("done")