| 3 天以前 | gongchunyi | ![]() |
| 3 天以前 | gongchunyi | ![]() |
| 3 天以前 | gongchunyi | ![]() |
| 3 天以前 | huminmin | ![]() |
| 3 天以前 | huminmin | ![]() |
| 3 天以前 | huminmin | ![]() |
| 3 天以前 | huminmin | ![]() |
| 3 天以前 | huminmin | ![]() |
| 3 天以前 | gongchunyi | ![]() |
| 3 天以前 | huminmin | ![]() |
doc/ÄþÏÄ-ÖÐÊ¢½¨²Ä.sql
@@ -92,5 +92,61 @@ add assigned_quantity DECIMAL(10, 4) default 0 not null COMMENT 'ä¸åæ°é'; alter table product_order add plan_complete_time datetime(0) NULL DEFAULT NULL COMMENT '计å宿æ¶é´', add combine_production_plan_ids varchar(500) default 'åå¹¶ç产计åid' not null; add plan_complete_time date NULL DEFAULT NULL COMMENT '计å宿æ¶é´'; # ç产订åä¸ç产计åå ³è表 drop table if exists product_order_plan; create table product_order_plan ( id bigint auto_increment primary key, product_order_id bigint not null default 0 comment 'ç产订åid', production_plan_id bigint not null default 0 comment 'ç产计åid', create_time datetime null comment 'å½å ¥æ¶é´', update_time datetime null comment 'æ´æ°æ¶é´', assigned_quantity DECIMAL(10, 4) default 0 not null comment 'ä¸åæ°é', index idx_product_order_id (product_order_id), index idx_production_plan_id (production_plan_id), unique idx_product_order_production_plan (product_order_id, production_plan_id) ); CREATE TABLE `product_material` ( `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT '主é®ID', `tenant_id` BIGINT DEFAULT NULL COMMENT 'ç§æ·ID', `material_type_id` INT DEFAULT NULL COMMENT 'å ³èç©æç±»åID', `inventory_category_id` INT DEFAULT NULL COMMENT 'å ³èåè´§ç±»å«ID', `identifier_code` VARCHAR(100) DEFAULT NULL COMMENT 'æ è¯ç¼ç ', `material_code` VARCHAR(100) DEFAULT NULL COMMENT 'ç©æä»£ç ', `product_name` VARCHAR(255) DEFAULT NULL COMMENT '产ååç§°', `material_name` VARCHAR(255) DEFAULT NULL COMMENT 'ç©æåå', `specification` VARCHAR(255) DEFAULT NULL COMMENT 'è§æ ¼åå·', `base_unit` VARCHAR(50) DEFAULT NULL COMMENT 'åºæ¬åä½', `material_attribute` VARCHAR(100) DEFAULT NULL COMMENT 'ç©æå±æ§', `finished_product_name` VARCHAR(100) DEFAULT NULL COMMENT 'æååå', `originator_name` VARCHAR(100) DEFAULT NULL COMMENT 'æäº¤äººå§å', `originator_org` VARCHAR(255) DEFAULT 'å®å¤ä¸å绿è½å®ä¸é墿éå ¬å¸', `remark` TEXT COMMENT '夿³¨', `create_time` DATETIME DEFAULT CURRENT_TIMESTAMP, `update_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, INDEX `idx_type_id` (`material_type_id`), INDEX `idx_cat_id` (`inventory_category_id`) ) ENGINE = INNODB DEFAULT CHARSET = utf8mb4 COMMENT = 'ç©æä¿¡æ¯è¡¨'; ALTER TABLE product_material ADD COLUMN form_instance_id VARCHAR(100) DEFAULT NULL COMMENT 'å®æè¡¨åå®ä¾ID', ADD COLUMN form_modified_time DATETIME DEFAULT NULL COMMENT 'å®æä¿®æ¹æ¶é´'; CREATE TABLE `product_material_config` ( `id` int NOT NULL AUTO_INCREMENT PRIMARY KEY, `config_type` varchar(50) NOT NULL COMMENT 'åºåç±»å: MATERIAL_TYPE æ INVENTORY_CAT', `config_name` varchar(100) NOT NULL COMMENT 'æ¾ç¤ºçåç§°' ) ENGINE = InnoDB COMMENT ='ç©æä¿¡æ¯è¡¨é 置表'; ALTER TABLE `production_plan` ADD COLUMN `product_material_id` int DEFAULT NULL COMMENT 'å ³èç©æä¿¡æ¯è¡¨ID' AFTER `material_code`; -- 建议顺便å ä¸ç´¢å¼ï¼æåå ³èæ¥è¯¢é度 ALTER TABLE `production_plan` ADD INDEX `idx_product_material_id` (`product_material_id`); src/main/java/com/ruoyi/framework/config/AliDingConfig.java
@@ -42,9 +42,15 @@ private String appType; /** * å®æè¡¨åID * éå®çäº§éæ±-å®æè¡¨åID */ private String formUuid; private String producePlanFormUuid; /** * ç©æç¼ç -å®æè¡¨åID */ private String materialCodeFormUuid; /** * 宿åºç¨å¯é¥ src/main/java/com/ruoyi/production/controller/ProductMaterialController.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,37 @@ package com.ruoyi.production.controller; import com.ruoyi.framework.aspectj.lang.annotation.Log; import com.ruoyi.framework.aspectj.lang.enums.BusinessType; import com.ruoyi.framework.web.domain.AjaxResult; import com.ruoyi.production.service.ProductMaterialService; 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; /** * <br> * 产åç©æä¿¡æ¯æ§å¶å± * </br> * * @author deslrey * @version 1.0 * @since 2026/03/11 16:38 */ @RestController @RequestMapping("/productMaterial") public class ProductMaterialController { @Autowired private ProductMaterialService productMaterialService; @GetMapping("/loadData") @ApiOperation("æåç©æç¼ç æ°æ®") @Log(title = "æåç©æç¼ç æ°æ®", businessType = BusinessType.INSERT) public AjaxResult loadProductMaterialData() { productMaterialService.loadProductMaterialData(); return AjaxResult.success(); } } src/main/java/com/ruoyi/production/controller/ProductOrderController.java
@@ -46,6 +46,12 @@ return R.ok(productOrderService.listProcessRoute(productModelId)); } @PostMapping("/revoke") @ApiOperation("æ¤åç产计å") public R revoke(@RequestBody ProductOrder productOrder) { return R.ok(productOrderService.revoke(productOrder)); } /** * 导åºç产订å */ src/main/java/com/ruoyi/production/enums/MaterialConfigTypeEnum.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,25 @@ package com.ruoyi.production.enums; /** * <br> * ç©æé 置类åæä¸¾ * </br> * * @author deslrey * @version 1.0 * @since 2026/03/11 17:24 */ public enum MaterialConfigTypeEnum { /** * ç©æç±»å * å¯¹åºæ°æ®åº config_type = MATERIAL_TYPE */ MATERIAL_TYPE, /** * åè´§ç±»å« * å¯¹åºæ°æ®åº config_type = INVENTORY_CAT */ INVENTORY_CAT } src/main/java/com/ruoyi/production/mapper/ProductMaterialConfigMapper.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,16 @@ package com.ruoyi.production.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.ruoyi.production.pojo.ProductMaterialConfig; /** * <br> * ç©æä¿¡æ¯è¡¨é ç½®Mapper * </br> * * @author deslrey * @version 1.0 * @since 2026/03/11 16:58 */ public interface ProductMaterialConfigMapper extends BaseMapper<ProductMaterialConfig> { } src/main/java/com/ruoyi/production/mapper/ProductMaterialMapper.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,16 @@ package com.ruoyi.production.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.ruoyi.production.pojo.ProductMaterial; /** * <br> * 产åç©æä¿¡æ¯Mapper * </br> * * @author deslrey * @version 1.0 * @since 2026/03/11 16:35 */ public interface ProductMaterialMapper extends BaseMapper<ProductMaterial> { } src/main/java/com/ruoyi/production/pojo/ProductMaterial.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,84 @@ package com.ruoyi.production.pojo; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.time.LocalDateTime; /** * <br> * 产åç©æä¿¡æ¯è¡¨ * </br> * * @author deslrey * @version 1.0 * @since 2026/03/11 16:31 */ @Data @TableName("product_material") @ApiModel(value = "ProductMaterial", description = "产åç©æä¿¡æ¯è¡¨") public class ProductMaterial { @TableId(type = IdType.AUTO) @ApiModelProperty("主é®ID") private Integer id; @ApiModelProperty("ç§æ·ID") private Long tenantId; @ApiModelProperty("ç©æç±»åID") private Integer materialTypeId; @ApiModelProperty("åè´§ç±»å«ID") private Integer inventoryCategoryId; @ApiModelProperty("æ è¯ç¼ç ") private String identifierCode; @ApiModelProperty("ç©æä»£ç ") private String materialCode; @ApiModelProperty("ç©æåå") private String materialName; @ApiModelProperty("è§æ ¼åå·") private String specification; @ApiModelProperty("åºæ¬åä½") private String baseUnit; @ApiModelProperty("ç©æå±æ§") private String materialAttribute; @ApiModelProperty("æååå") private String finishedProductName; @ApiModelProperty("æäº¤äººå§å") private String originatorName; @ApiModelProperty("æäº¤äººç»ç»") private String originatorOrg; @ApiModelProperty("夿³¨") private String remark; @ApiModelProperty("å建æ¶é´") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private LocalDateTime createTime; @ApiModelProperty("ä¿®æ¹æ¶é´") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private LocalDateTime updateTime; @ApiModelProperty("å®æè¡¨åå®ä¾ID") private String formInstanceId; @ApiModelProperty("å®æä¿®æ¹æ¶é´") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private LocalDateTime formModifiedTime; } src/main/java/com/ruoyi/production/pojo/ProductMaterialConfig.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,33 @@ package com.ruoyi.production.pojo; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; /** * <br> * ç©æä¿¡æ¯è¡¨é 置表 * </br> * * @author deslrey * @version 1.0 * @since 2026/03/11 16:57 */ @Data @TableName("product_material_config") @ApiModel(value = "ProductMaterialConfig", description = "ç©æä¿¡æ¯é 置表") public class ProductMaterialConfig { @TableId(type = IdType.AUTO) @ApiModelProperty("主é®ID") private Integer id; @ApiModelProperty("åºåç±»å: MATERIAL_TYPE æ INVENTORY_CAT") private String configType; @ApiModelProperty("é ç½®åç§°") private String configName; } src/main/java/com/ruoyi/production/pojo/ProductOrder.java
@@ -10,6 +10,7 @@ import java.io.Serializable; import java.math.BigDecimal; import java.time.LocalDate; import java.time.LocalDateTime; import java.util.List; @@ -36,18 +37,12 @@ private String npsNo; /** * åå¹¶ç产计åids */ @ApiModelProperty(value = "åå¹¶ç产计åids") private String combineProductionPlanIds; /** * 计å宿æ¶é´ */ @ApiModelProperty(value = "计å宿æ¶é´") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") private LocalDateTime planCompleteTime; @JsonFormat(pattern = "yyyy-MM-dd") @DateTimeFormat(pattern = "yyyy-MM-dd") private LocalDate planCompleteTime; /** * ç§æ·id src/main/java/com/ruoyi/production/pojo/ProductionProductMain.java
@@ -32,6 +32,9 @@ @ApiModelProperty(value = "å·¥åid") private Long workOrderId; @ApiModelProperty(value = "ç产订åid") private Long productOrderId; @ApiModelProperty(value = "æ¥å·¥ç¶æ") private Integer status; src/main/java/com/ruoyi/production/service/ProductMaterialConfigService.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,16 @@ package com.ruoyi.production.service; import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.production.pojo.ProductMaterialConfig; /** * <br> * ç©æä¿¡æ¯è¡¨é ç½®æ¥å£ * </br> * * @author deslrey * @version 1.0 * @since 2026/03/11 16:58 */ public interface ProductMaterialConfigService extends IService<ProductMaterialConfig> { } src/main/java/com/ruoyi/production/service/ProductMaterialService.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,20 @@ package com.ruoyi.production.service; import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.production.pojo.ProductMaterial; /** * <br> * 产åç©æä¿¡æ¯æ¥å£ * </br> * * @author deslrey * @version 1.0 * @since 2026/03/11 16:35 */ public interface ProductMaterialService extends IService<ProductMaterial> { void loadProductMaterialData(); void syncProductMaterialJob(); } src/main/java/com/ruoyi/production/service/ProductOrderService.java
@@ -18,6 +18,11 @@ int bindingRoute(ProductOrder productOrder); /** * æ¤åç产计å */ Boolean revoke(ProductOrder productOrder); List<ProcessRoute> listProcessRoute(Long productModelId); List<ProductStructureDto> listProcessBom(Long orderId); src/main/java/com/ruoyi/production/service/impl/ProductMaterialConfigServiceImpl.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,24 @@ package com.ruoyi.production.service.impl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.production.mapper.ProductMaterialConfigMapper; import com.ruoyi.production.pojo.ProductMaterialConfig; import com.ruoyi.production.service.ProductMaterialConfigService; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; /** * <br> * ç©æä¿¡æ¯è¡¨é ç½®æ¥å£å®ç°ç±» * </br> * * @author deslrey * @version 1.0 * @since 2026/03/11 16:59 */ @Slf4j @Service public class ProductMaterialConfigServiceImpl extends ServiceImpl<ProductMaterialConfigMapper, ProductMaterialConfig> implements ProductMaterialConfigService { } src/main/java/com/ruoyi/production/service/impl/ProductMaterialServiceImpl.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,306 @@ package com.ruoyi.production.service.impl; import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSONArray; import com.alibaba.fastjson2.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.http.HttpUtils; import com.ruoyi.framework.config.AliDingConfig; import com.ruoyi.production.enums.MaterialConfigTypeEnum; import com.ruoyi.production.mapper.ProductMaterialMapper; import com.ruoyi.production.pojo.ProductMaterial; import com.ruoyi.production.pojo.ProductMaterialConfig; import com.ruoyi.production.service.ProductMaterialConfigService; import com.ruoyi.production.service.ProductMaterialService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.nio.charset.StandardCharsets; import java.time.LocalDateTime; import java.time.OffsetDateTime; import java.time.ZoneId; import java.time.format.DateTimeFormatter; import java.time.format.DateTimeParseException; import java.util.ArrayList; import java.util.List; import java.util.concurrent.locks.ReentrantLock; /** * <br> * 产åç©æä¿¡æ¯æ¥å£å®ç°ç±» * </br> * * @author deslrey * @version 1.0 * @since 2026/03/11 16:36 */ @Slf4j @Service public class ProductMaterialServiceImpl extends ServiceImpl<ProductMaterialMapper, ProductMaterial> implements ProductMaterialService { @Autowired private AliDingConfig aliDingConfig; @Autowired private ProductMaterialConfigService productMaterialConfigService; /** * 忥éï¼é²æ¢æå¨å宿¶ä»»å¡åæ¶æ§è¡ */ private final ReentrantLock syncLock = new ReentrantLock(); @Override public void loadProductMaterialData() { syncProductMaterialData(1); } @Override public void syncProductMaterialJob() { syncProductMaterialData(2); } /** * åæ¥æ°æ® */ @Transactional(rollbackFor = Exception.class) public void syncProductMaterialData(Integer dataSyncType) { if (!syncLock.tryLock()) { log.warn("忥æ£å¨è¿è¡ä¸ï¼æ¬æ¬¡ {} åæ¥è¯·æ±è¢«è·³è¿", dataSyncType == 1 ? "æå¨" : "宿¶ä»»å¡"); return; } try { // è·å AccessToken String accessToken = getAccessToken(); if (StringUtils.isEmpty(accessToken)) { return; } // è·åæ¬å°æå忥æ¶é´ LocalDateTime lastSyncTime = getLastSyncTime(); log.info("å¼å§ç©æç¼ç å¢éåæ¥ï¼æ¬å°æåä¿®æ¹æ¶é´: {}", lastSyncTime); int pageNumber = 1; int pageSize = 50; boolean hasMore = true; int totalSynced = 0; while (hasMore) { // æ¥è¯¢åæ° JSONObject searchParam = buildSearchParam(lastSyncTime, pageNumber, pageSize); // è°ç¨å®ææ¥å£æåæ°æ® String dataRes = HttpUtils.sendPostJson( aliDingConfig.getSearchFormDataUrl(), searchParam.toJSONString(), StandardCharsets.UTF_8.name(), null, accessToken ); if (StringUtils.isEmpty(dataRes)) { log.warn("第 {} 页æåæ°æ®ä¸ºç©º", pageNumber); break; } JSONObject resultObj = JSON.parseObject(dataRes); JSONArray dataArr = resultObj.getJSONArray("data"); Integer totalCount = resultObj.getInteger("totalCount"); if (dataArr == null || dataArr.isEmpty()) { log.info("æ²¡ææ´å¤æ°æ°æ®éè¦åæ¥"); break; } // è§£æå¹¶ä¿åæ°æ® List<ProductMaterial> list = parseProductMaterials(dataArr, totalCount); if (!list.isEmpty()) { // å¤çæ´æ°ææ°å¢ int affected = processSaveOrUpdate(list); totalSynced += affected; } // 夿æ¯å¦è¿æä¸ä¸é¡µ hasMore = (pageNumber * pageSize) < totalCount; pageNumber++; log.info("æ£å¨åæ¥ç¬¬ {} 页ï¼å½å已忥 {}/{}", pageNumber - 1, totalSynced, totalCount); } log.info("ç©ææ°æ®åæ¥å®æï¼å ±åæ¥ {} æ¡æ°æ®", totalSynced); } catch (Exception e) { log.error("åæ¥ç©æç¼ç å¼å¸¸", e); } finally { // éæ¾é syncLock.unlock(); } } private String getAccessToken() { String params = "appkey=" + aliDingConfig.getAppKey() + "&appsecret=" + aliDingConfig.getAppSecret(); String tokenRes = HttpUtils.sendGet(aliDingConfig.getAccessTokenUrl(), params); JSONObject tokenObj = JSON.parseObject(tokenRes); String accessToken = tokenObj.getString("access_token"); if (StringUtils.isEmpty(accessToken)) { log.error("è·åééAccessToken失败: {}", tokenRes); } return accessToken; } private LocalDateTime getLastSyncTime() { LambdaQueryWrapper<ProductMaterial> queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.orderByDesc(ProductMaterial::getFormModifiedTime).last("LIMIT 1"); ProductMaterial lastRecord = this.getOne(queryWrapper); return lastRecord != null ? lastRecord.getFormModifiedTime() : null; } private JSONObject buildSearchParam(LocalDateTime lastSyncTime, int pageNumber, int pageSize) { JSONObject searchParam = new JSONObject(); searchParam.put("appType", aliDingConfig.getAppType()); searchParam.put("systemToken", aliDingConfig.getSystemToken()); searchParam.put("userId", aliDingConfig.getUserId()); searchParam.put("formUuid", aliDingConfig.getMaterialCodeFormUuid()); searchParam.put("currentPage", pageNumber); searchParam.put("pageSize", pageSize); JSONArray searchConditions = new JSONArray(); JSONObject statusCondition = new JSONObject(); statusCondition.put("key", "processInstanceStatus"); JSONArray statusValueArray = new JSONArray(); statusValueArray.add("COMPLETED"); statusCondition.put("value", statusValueArray); statusCondition.put("type", "ARRAY"); statusCondition.put("operator", "in"); statusCondition.put("componentName", "SelectField"); searchConditions.add(statusCondition); JSONObject resultCondition = new JSONObject(); resultCondition.put("key", "processApprovedResult"); JSONArray resultValueArray = new JSONArray(); resultValueArray.add("agree"); resultCondition.put("value", resultValueArray); resultCondition.put("type", "ARRAY"); resultCondition.put("operator", "in"); resultCondition.put("componentName", "SelectField"); searchConditions.add(resultCondition); searchParam.put("searchFieldJson", searchConditions.toJSONString()); searchParam.put("orderConfigJson", "{\"gmt_modified\":\"+\"}"); if (lastSyncTime != null) { String startTime = lastSyncTime.plusSeconds(1).atZone(ZoneId.systemDefault()) .format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); searchParam.put("modifiedFromTimeGMT", startTime); } String endTime = LocalDateTime.now().atZone(ZoneId.systemDefault()) .format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); searchParam.put("modifiedToTimeGMT", endTime); return searchParam; } private List<ProductMaterial> parseProductMaterials(JSONArray dataArr, Integer totalCount) { List<ProductMaterial> list = new ArrayList<>(); LocalDateTime now = LocalDateTime.now(); for (int i = 0; i < dataArr.size(); i++) { JSONObject item = dataArr.getJSONObject(i); String formInstanceId = item.getString("formInstanceId"); JSONObject originator = item.getJSONObject("originator"); String originatorName = originator != null && originator.containsKey("userName") ? originator.getJSONObject("userName").getString("nameInChinese") : "æªç¥"; JSONObject formData = item.getJSONObject("formData"); ProductMaterial material = new ProductMaterial(); material.setFormInstanceId(formInstanceId); material.setIdentifierCode(formData.getString("textField_l92h77ju")); material.setMaterialCode(formData.getString("textField_l92f36f2")); material.setMaterialName(formData.getString("textField_l92f36f5")); material.setSpecification(formData.getString("textField_l92f36f6")); material.setBaseUnit(formData.getString("textField_la147lnw")); material.setMaterialAttribute(formData.getString("selectField_la14k51j")); material.setFinishedProductName(formData.getString("radioField_lbkk2nn2")); material.setRemark(formData.getString("textareaField_l92f36f9")); // å¤çç©æç±»åååè´§ç±»å« String materialType = formData.getString("selectField_l92f36fb"); String inventoryCat = formData.getString("selectField_la154noy"); material.setMaterialTypeId(getOrCreateConfigId(materialType, MaterialConfigTypeEnum.MATERIAL_TYPE.name())); material.setInventoryCategoryId(getOrCreateConfigId(inventoryCat, MaterialConfigTypeEnum.INVENTORY_CAT.name())); material.setOriginatorName(originatorName); material.setOriginatorOrg("å®å¤ä¸å绿è½å®ä¸é墿éå ¬å¸"); material.setFormModifiedTime(parseUtcTime(item.getString("modifiedTimeGMT"))); material.setCreateTime(now); material.setUpdateTime(now); list.add(material); } return list; } private Integer getOrCreateConfigId(String name, String type) { if (StringUtils.isEmpty(name)) { return null; } ProductMaterialConfig config = productMaterialConfigService.getOne(new LambdaQueryWrapper<ProductMaterialConfig>() .eq(ProductMaterialConfig::getConfigName, name) .eq(ProductMaterialConfig::getConfigType, type)); if (config == null) { config = new ProductMaterialConfig(); config.setConfigName(name); config.setConfigType(type); productMaterialConfigService.save(config); } return config.getId(); } private int processSaveOrUpdate(List<ProductMaterial> list) { if (list == null || list.isEmpty()) { return 0; } int affected = 0; for (ProductMaterial material : list) { ProductMaterial exist = this.getOne(new LambdaQueryWrapper<ProductMaterial>() .eq(ProductMaterial::getFormInstanceId, material.getFormInstanceId())); if (exist == null) { this.save(material); affected++; log.info("æ°å¢ç©ææ°æ® formInstanceId={}", material.getFormInstanceId()); } else { if (exist.getFormModifiedTime() == null || !exist.getFormModifiedTime().equals(material.getFormModifiedTime())) { material.setId(exist.getId()); material.setCreateTime(exist.getCreateTime()); this.updateById(material); affected++; log.info("æ´æ°ç©ææ°æ® formInstanceId={}", material.getFormInstanceId()); } } } return affected; } private LocalDateTime parseUtcTime(String utcString) { if (StringUtils.isEmpty(utcString)) { return null; } try { OffsetDateTime odt = OffsetDateTime.parse(utcString); return odt.toLocalDateTime(); } catch (DateTimeParseException ex) { log.warn("è§£ææ¶é´ {} 失败: {}", utcString, ex.getMessage()); return null; } } } src/main/java/com/ruoyi/production/service/impl/ProductOrderServiceImpl.java
@@ -15,10 +15,15 @@ import com.ruoyi.production.mapper.*; import com.ruoyi.production.pojo.*; import com.ruoyi.production.service.ProductOrderService; import com.ruoyi.productionPlan.mapper.ProductOrderPlanMapper; import com.ruoyi.productionPlan.mapper.ProductionPlanMapper; import com.ruoyi.productionPlan.pojo.ProductOrderPlan; import com.ruoyi.productionPlan.pojo.ProductionPlan; import com.ruoyi.quality.mapper.QualityInspectMapper; import com.ruoyi.quality.pojo.QualityInspect; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; import java.time.LocalDate; @@ -49,6 +54,12 @@ @Autowired private ProductionProductMainMapper productionProductMainMapper; @Autowired private ProductOrderPlanMapper productOrderPlanMapper; @Autowired private ProductionPlanMapper productionPlanMapper; @Autowired private ProductionProductOutputMapper productionProductOutputMapper; @@ -123,6 +134,29 @@ } @Override @Transactional(rollbackFor = Exception.class) public Boolean revoke(ProductOrder productOrder) { // todo 夿æ¯å¦äº§çæ¥å·¥ä¿¡æ¯ // æ¥è¯¢åå¹¶çç产计å List<ProductOrderPlan> productOrderPlans = productOrderPlanMapper.selectList(Wrappers.<ProductOrderPlan>lambdaQuery().in(ProductOrderPlan::getProductOrderId, productOrder.getId())); if (productOrderPlans.isEmpty()) { throw new RuntimeException("åå¹¶çç产计åä¸åå¨"); } for (ProductOrderPlan productOrderPlan : productOrderPlans) { ProductionPlan productionPlan = productionPlanMapper.selectById(productOrderPlan.getProductionPlanId()); productionPlan.setAssignedQuantity(productionPlan.getAssignedQuantity().subtract(productOrderPlan.getAssignedQuantity())); productionPlanMapper.updateById(productionPlan); } // å é¤å ³èå ³ç³» productOrderPlanMapper.delete(Wrappers.<ProductOrderPlan>lambdaQuery().in(ProductOrderPlan::getProductOrderId, productOrder.getId())); // å é¤è®¢å productOrderMapper.deleteById(productOrder.getId()); // todo å é¤è®¢åä¸çå·¥èºè·¯çº¿å表 return null; } @Override public List<ProcessRoute> listProcessRoute(Long productModelId) { return productOrderMapper.listProcessRoute(productModelId); } src/main/java/com/ruoyi/production/task/ProductMaterialTask.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,27 @@ package com.ruoyi.production.task; import com.ruoyi.production.service.ProductMaterialService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; /** * <br> * * </br> * * @author deslrey * @version 1.0 * @since 2026/03/11 16:39 */ @Component public class ProductMaterialTask { @Autowired private ProductMaterialService productMaterialService; @Scheduled(cron = "0 0 * * * ?") public void syncProdDataJob() { productMaterialService.syncProductMaterialJob(); } } src/main/java/com/ruoyi/productionPlan/controller/ProductOrderPlanController.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,18 @@ package com.ruoyi.productionPlan.controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; /** * <p> * å端æ§å¶å¨ * </p> * * @author è¯å¯¼è½¯ä»¶ï¼æ±èï¼æéå ¬å¸ * @since 2026-03-11 03:02:58 */ @RestController @RequestMapping("/productOrderPlan") public class ProductOrderPlanController { } src/main/java/com/ruoyi/productionPlan/controller/ProductionPlanController.java
@@ -67,7 +67,7 @@ @Log(title = "æ´æ°ç产计å", businessType = BusinessType.UPDATE) @ApiOperation("æ´æ°ç产计å") public AjaxResult update(@RequestBody ProductionPlanDto productionPlanDto) { return AjaxResult.success(productionPlanService.updateById(productionPlanDto)); return AjaxResult.success(productionPlanService.update(productionPlanDto)); } @DeleteMapping("") src/main/java/com/ruoyi/productionPlan/dto/ProductionPlanDto.java
@@ -8,7 +8,7 @@ import org.springframework.format.annotation.DateTimeFormat; import java.math.BigDecimal; import java.time.LocalDateTime; import java.time.LocalDate; import java.util.List; @Data @@ -20,7 +20,7 @@ private BigDecimal totalAssignedQuantity; @ApiModelProperty(value = "计å宿æ¶é´") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") private LocalDateTime planCompleteTime; @JsonFormat(pattern = "yyyy-MM-dd") @DateTimeFormat(pattern = "yyyy-MM-dd") private LocalDate planCompleteTime; } src/main/java/com/ruoyi/productionPlan/mapper/ProductOrderPlanMapper.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,18 @@ package com.ruoyi.productionPlan.mapper; import com.ruoyi.productionPlan.pojo.ProductOrderPlan; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.apache.ibatis.annotations.Mapper; /** * <p> * Mapper æ¥å£ * </p> * * @author è¯å¯¼è½¯ä»¶ï¼æ±èï¼æéå ¬å¸ * @since 2026-03-11 03:02:58 */ @Mapper public interface ProductOrderPlanMapper extends BaseMapper<ProductOrderPlan> { } src/main/java/com/ruoyi/productionPlan/pojo/ProductOrderPlan.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,54 @@ package com.ruoyi.productionPlan.pojo; import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import java.io.Serializable; import java.math.BigDecimal; import java.time.LocalDateTime; import com.ruoyi.framework.aspectj.lang.annotation.Excel; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Getter; import lombok.Setter; /** * <p> * * </p> * * @author è¯å¯¼è½¯ä»¶ï¼æ±èï¼æéå ¬å¸ * @since 2026-03-11 03:02:58 */ @Getter @Setter @TableName("product_order_plan") @ApiModel(value = "ProductOrderPlan对象", description = "") public class ProductOrderPlan implements Serializable { private static final long serialVersionUID = 1L; @TableId(value = "id", type = IdType.AUTO) private Long id; @ApiModelProperty("ç产订åid") private Long productOrderId; @ApiModelProperty("ç产计åid") private Long productionPlanId; @ApiModelProperty(value = "ä¸åæ°é") @Excel(name = "ä¸åæ°é") private BigDecimal assignedQuantity; @ApiModelProperty("å½å ¥æ¶é´") @TableField(fill = FieldFill.INSERT) private LocalDateTime createTime; @ApiModelProperty("æ´æ°æ¶é´") @TableField(fill = FieldFill.INSERT_UPDATE) private LocalDateTime updateTime; } src/main/java/com/ruoyi/productionPlan/pojo/ProductionPlan.java
@@ -7,6 +7,7 @@ import com.ruoyi.framework.aspectj.lang.annotation.Excel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import org.springframework.format.annotation.DateTimeFormat; import java.math.BigDecimal; import java.time.LocalDateTime; @@ -63,6 +64,13 @@ @ApiModelProperty("ç©æç¼ç ") @Excel(name = "ç©æç¼ç ") private String materialCode; /** * å ³èç©æä¿¡æ¯è¡¨ID */ @ApiModelProperty("å ³èç©æä¿¡æ¯è¡¨ID") private Integer productMaterialId; /** * 产ååç§° @@ -126,6 +134,7 @@ @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") @ApiModelProperty("å¼å§æ¥æ") @Excel(name = "å¼å§æ¥æ", width = 20, dateFormat = "yyyy-MM-dd") @DateTimeFormat(pattern = "yyyy-MM-dd") private Date startDate; /** @@ -134,6 +143,7 @@ @ApiModelProperty("ç»ææ¥æ") @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") @Excel(name = "ç»ææ¥æ", width = 20, dateFormat = "yyyy-MM-dd") @DateTimeFormat(pattern = "yyyy-MM-dd") private Date endDate; /** @@ -227,4 +237,20 @@ @ApiModelProperty(value = "ä¸åæ°é") @Excel(name = "ä¸åæ°é") private BigDecimal assignedQuantity; /** * 计ç®å©ä½æ¹æ° * * @return å©ä½æ¹æ° */ @ApiModelProperty(value = "å©ä½æ¹æ°") public BigDecimal getRemainingVolume() { if (volume == null) { return BigDecimal.ZERO; } if (assignedQuantity == null) { return volume; } return volume.subtract(assignedQuantity); } } src/main/java/com/ruoyi/productionPlan/service/ProductOrderPlanService.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,16 @@ package com.ruoyi.productionPlan.service; import com.ruoyi.productionPlan.pojo.ProductOrderPlan; import com.baomidou.mybatisplus.extension.service.IService; /** * <p> * æå¡ç±» * </p> * * @author è¯å¯¼è½¯ä»¶ï¼æ±èï¼æéå ¬å¸ * @since 2026-03-11 03:02:58 */ public interface ProductOrderPlanService extends IService<ProductOrderPlan> { } src/main/java/com/ruoyi/productionPlan/service/ProductionPlanService.java
@@ -44,6 +44,16 @@ boolean add(ProductionPlanDto productionPlanDto); /** * æ´æ°ç产计å */ boolean update(ProductionPlanDto productionPlanDto); /** * å é¤ç产计å */ boolean delete(List<Long> ids); /** * æç §äº§åç±»å«æ±æ»ç»è®¡éæ±é */ List<ProductionPlanSummaryDto> summaryByProductType(ProductionPlanSummaryDto query); src/main/java/com/ruoyi/productionPlan/service/impl/ProductOrderPlanServiceImpl.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,20 @@ package com.ruoyi.productionPlan.service.impl; import com.ruoyi.productionPlan.pojo.ProductOrderPlan; import com.ruoyi.productionPlan.mapper.ProductOrderPlanMapper; import com.ruoyi.productionPlan.service.ProductOrderPlanService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springframework.stereotype.Service; /** * <p> * æå¡å®ç°ç±» * </p> * * @author è¯å¯¼è½¯ä»¶ï¼æ±èï¼æéå ¬å¸ * @since 2026-03-11 03:02:58 */ @Service public class ProductOrderPlanServiceImpl extends ServiceImpl<ProductOrderPlanMapper, ProductOrderPlan> implements ProductOrderPlanService { } src/main/java/com/ruoyi/productionPlan/service/impl/ProductionPlanServiceImpl.java
@@ -5,20 +5,26 @@ import com.alibaba.fastjson2.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.exception.base.BaseException; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.bean.BeanUtils; import com.ruoyi.common.utils.http.HttpUtils; import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.framework.config.AliDingConfig; import com.ruoyi.production.pojo.ProductMaterial; import com.ruoyi.production.pojo.ProductOrder; import com.ruoyi.production.service.ProductMaterialService; import com.ruoyi.production.service.ProductOrderService; import com.ruoyi.productionPlan.dto.ProductionPlanDto; import com.ruoyi.productionPlan.dto.ProductionPlanImportDto; import com.ruoyi.productionPlan.dto.ProductionPlanSummaryDto; import com.ruoyi.productionPlan.mapper.ProductOrderPlanMapper; import com.ruoyi.productionPlan.mapper.ProductionPlanMapper; import com.ruoyi.productionPlan.pojo.ProductOrderPlan; import com.ruoyi.productionPlan.pojo.ProductionPlan; import com.ruoyi.productionPlan.service.ProductionPlanService; import lombok.extern.slf4j.Slf4j; @@ -62,6 +68,12 @@ @Autowired private ProductOrderService productOrderService; @Autowired private ProductOrderPlanMapper productOrderPlanMapper; @Autowired private ProductMaterialService productMaterialService; /** * 忥éï¼ç¡®ä¿æå¨å宿¶ä»»å¡ä¸åæ¶æ§è¡ */ @@ -100,32 +112,36 @@ // æ¥è¯¢ä¸»ç产计å List<ProductionPlan> plans = productionPlanMapper.selectBatchIds(productionPlanDto.getIds()); plans.sort(Comparator.comparingLong(ProductionPlan::getId)); // æ ¡éªæ¯å¦åå¨ä¸åç产ååç§° String firstProductName = plans.get(0).getProductName(); if (plans.stream().anyMatch(p -> !p.getProductName().equals(firstProductName))) { log.warn("å并失败ï¼åå¨ä¸åç产ååç§°"); return false; throw new BaseException("å并失败ï¼åå¨ä¸åç产ååç§°"); } // æ ¡éªæ¯å¦åå¨ä¸åç产åè§æ ¼ String firstProductSpec = plans.get(0).getProductSpec(); if (plans.stream().anyMatch(p -> !p.getProductSpec().equals(firstProductSpec))) { log.warn("å并失败ï¼åå¨ä¸åç产åè§æ ¼"); return false; throw new BaseException("å并失败ï¼åå¨ä¸åç产åè§æ ¼"); } // å å æ¹æ° BigDecimal totalVolume = plans.stream() .map(ProductionPlan::getVolume) // å å å©ä½æ¹æ° BigDecimal totalRemainingVolume = plans.stream() .map(ProductionPlan::getRemainingVolume) .filter(v -> v != null) .reduce(BigDecimal.ZERO, BigDecimal::add); // 夿ä¸åæ°éæ¯å¦å¤§äºçäºæ¹æ° if (productionPlanDto.getTotalAssignedQuantity().compareTo(totalVolume) > 0) { log.warn("æä½å¤±è´¥ï¼ä¸åæ°éä¸è½å¤§äºæ¹æ°"); return false; // 夿ä¸åæ°éæ¯å¦å¤§äºçäºå©ä½æ¹æ° if (productionPlanDto.getTotalAssignedQuantity().compareTo(totalRemainingVolume) > 0) { throw new BaseException("æä½å¤±è´¥ï¼ä¸åæ°éä¸è½å¤§äºå©ä½æ¹æ°"); } // å建ç产订å ProductOrder productOrder = new ProductOrder(); productOrder.setQuantity(productionPlanDto.getTotalAssignedQuantity()); productOrder.setPlanCompleteTime(productionPlanDto.getPlanCompleteTime()); productOrderService.addProductOrder(productOrder); // æ ¹æ®ä¸åæ°éï¼ä»ç¬¬ä¸ä¸ªç产计åå¼å§åé æ¹æ° BigDecimal assignedVolume = BigDecimal.ZERO; @@ -134,26 +150,35 @@ if (volume == null) { continue; } // 计ç®å©ä½æ¹æ° BigDecimal remainingVolume = plan.getRemainingVolume(); if (remainingVolume.compareTo(BigDecimal.ZERO) <= 0) { continue; } if (assignedVolume.add(volume).compareTo(productionPlanDto.getTotalAssignedQuantity()) >= 0) { ProductOrderPlan productOrderPlan = new ProductOrderPlan(); productOrderPlan.setProductOrderId(productOrder.getId()); productOrderPlan.setProductionPlanId(plan.getId()); if (assignedVolume.add(remainingVolume).compareTo(productionPlanDto.getTotalAssignedQuantity()) >= 0) { // æåä¸ä¸ªè®¡åï¼åé å©ä½æ¹æ° plan.setAssignedQuantity(productionPlanDto.getTotalAssignedQuantity().subtract(assignedVolume)); BigDecimal lastRemainingVolume = productionPlanDto.getTotalAssignedQuantity().subtract(assignedVolume); plan.setAssignedQuantity(plan.getAssignedQuantity().add(lastRemainingVolume)); productOrderPlan.setAssignedQuantity(lastRemainingVolume); productionPlanMapper.updateById(plan); productOrderPlanMapper.insert(productOrderPlan); break; } // åé å½åè®¡åæ¹æ° plan.setAssignedQuantity(volume); plan.setAssignedQuantity(plan.getAssignedQuantity().add(remainingVolume)); productOrderPlan.setAssignedQuantity(remainingVolume); // æ´æ°ç产计å productionPlanMapper.updateById(plan); assignedVolume = assignedVolume.add(volume); // åå»ºå ³èå ³ç³» productOrderPlanMapper.insert(productOrderPlan); assignedVolume = assignedVolume.add(remainingVolume); } // å建ç产订å ProductOrder productOrder = new ProductOrder(); String combineIds = StringUtils.join(productionPlanDto.getIds(), ","); productOrder.setCombineProductionPlanIds(combineIds); productOrder.setQuantity(productionPlanDto.getTotalAssignedQuantity()); productOrder.setPlanCompleteTime(productionPlanDto.getPlanCompleteTime()); productOrderService.addProductOrder(productOrder); return true; } @@ -163,6 +188,33 @@ productionPlanDto.setDataSourceType(PRODUCTION_FORECAST.getCode()); productionPlanMapper.insert(productionPlanDto); return true; } @Override @Transactional(rollbackFor = Exception.class) public boolean update(ProductionPlanDto productionPlanDto) { // æ¥è¯¢æ¯å¦æå ³è订å boolean hasProductOrderPlan = productOrderPlanMapper.selectList(Wrappers.<ProductOrderPlan>lambdaQuery().eq(ProductOrderPlan::getProductionPlanId, productionPlanDto.getId())).stream().anyMatch(p -> p.getProductOrderId() != null); if (hasProductOrderPlan) { // å¦æå ³èï¼æ¹æ°åªè½éå¢ ProductionPlan currentPlan = productionPlanMapper.selectById(productionPlanDto.getId()); if (productionPlanDto.getVolume().compareTo(currentPlan.getVolume()) < 0) { throw new BaseException("æ¹æ°ä¸è½éå"); } } return productionPlanMapper.updateById(productionPlanDto) > 0; } @Override @Transactional(rollbackFor = Exception.class) public boolean delete(List<Long> ids) { // 妿æå ³è订åï¼åä¸è½å é¤ if (productOrderPlanMapper.selectList(Wrappers.<ProductOrderPlan>lambdaQuery().in(ProductOrderPlan::getProductionPlanId, ids)).stream().anyMatch(p -> p.getProductOrderId() != null)) { throw new BaseException("å é¤å¤±è´¥ï¼åå¨å ³è订å"); } return productionPlanMapper.deleteBatchIds(ids) > 0; } /** @@ -267,9 +319,23 @@ searchParam.put("appType", aliDingConfig.getAppType()); searchParam.put("systemToken", aliDingConfig.getSystemToken()); searchParam.put("userId", aliDingConfig.getUserId()); searchParam.put("formUuid", aliDingConfig.getFormUuid()); searchParam.put("formUuid", aliDingConfig.getProducePlanFormUuid()); searchParam.put("currentPage", pageNumber); searchParam.put("pageSize", pageSize); searchParam.put("pageNumber", pageNumber); JSONArray searchConditions = new JSONArray(); JSONObject condition = new JSONObject(); condition.put("key", "processApprovedResult"); JSONArray valueArray = new JSONArray(); valueArray.add("agree"); condition.put("value", valueArray); condition.put("type", "ARRAY"); condition.put("operator", "in"); condition.put("componentName", "SelectField"); searchConditions.add(condition); searchParam.put("searchFieldJson", searchConditions.toJSONString()); // é»è®¤æä¿®æ¹æ¶é´ååºæåºï¼ç¡®ä¿å页æåæ°æ®çè¿ç»æ§ // "+" 表示ååºï¼"gmt_modified" æ¯å®æ¹å ç½®åæ®µ @@ -319,7 +385,19 @@ plan.setApplyNo(formData.getString("textField_l7fytfco")); plan.setCustomerName(formData.getString("textField_lbkozohg")); plan.setMaterialCode(row.getString("textField_l9xo62q5")); String materialCode = row.getString("textField_l9xo62q5"); plan.setMaterialCode(materialCode); // æ ¹æ®ç©æç¼ç æ¥è¯¢ç©æä¿¡æ¯è¡¨ï¼å ³èç©æID if (StringUtils.isNotEmpty(materialCode)) { LambdaQueryWrapper<ProductMaterial> queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(ProductMaterial::getMaterialCode, materialCode); ProductMaterial productMaterial = productMaterialService.getOne(queryWrapper); if (productMaterial != null) { plan.setProductMaterialId(productMaterial.getId()); } } plan.setProductName(row.getString("textField_l9xo62q7")); plan.setProductSpec(row.getString("textField_l9xo62q8")); plan.setLength(row.getInteger("numberField_lb7lgatg_value")); src/main/resources/application-zsjc.yml
@@ -30,7 +30,8 @@ app-secret: "fO07qSZC5SMLw9It3Ydd3BuoFyVbRlsWXUnVr2kwPJXz0OpUntCAO5dqnr8G7zq5" user-id: "290166234126410562" app-type: "APP_UY8XMO7GNA8OF08EFNVQ" form-uuid: "FORM-4IA66891C5H3QWMDBSGO05C0OX9628GRPYF7L8" produce-plan-form-uuid: "FORM-4IA66891C5H3QWMDBSGO05C0OX9628GRPYF7L8" material-code-form-uuid: "FORM-8I666N718RW4ALO4ETYDDB0U6U8T3EIWTQ0ALL1" system-token: "4J766L91OFH3V612E7LG5B4DI8M13MQF9VF7LG4" # æ¥å£å°å access-token-url: "https://oapi.dingtalk.com/gettoken" src/main/resources/mapper/production/ProductMaterialMapper.xml
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,25 @@ <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.ruoyi.production.mapper.ProductMaterialMapper"> <resultMap id="ProductMaterialResultMap" type="com.ruoyi.production.pojo.ProductMaterial"> <id property="id" column="id"/> <result property="tenantId" column="tenant_id"/> <result property="materialTypeId" column="material_type_id"/> <result property="inventoryCategoryId" column="inventory_category_id"/> <result property="identifierCode" column="identifier_code"/> <result property="materialCode" column="material_code"/> <result property="materialName" column="material_name"/> <result property="specification" column="specification"/> <result property="baseUnit" column="base_unit"/> <result property="materialAttribute" column="material_attribute"/> <result property="finishedProductName" column="finished_product_name"/> <result property="originatorName" column="originator_name"/> <result property="originatorOrg" column="originator_org"/> <result property="remark" column="remark"/> <result property="createTime" column="create_time"/> <result property="updateTime" column="update_time"/> </resultMap> </mapper> src/main/resources/mapper/productionPlan/ProductOrderPlanMapper.xml
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,14 @@ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.ruoyi.productionPlan.mapper.ProductOrderPlanMapper"> <!-- éç¨æ¥è¯¢æ å°ç»æ --> <resultMap id="BaseResultMap" type="com.ruoyi.productionPlan.pojo.ProductOrderPlan"> <id column="id" property="id" /> <result column="product_order_id" property="productOrderId" /> <result column="production_plan_id" property="productionPlanId" /> <result column="create_time" property="createTime" /> <result column="update_time" property="updateTime" /> </resultMap> </mapper> src/main/resources/mapper/productionPlan/ProductionPlanMapper.xml
@@ -12,6 +12,7 @@ <result property="applyNo" column="apply_no"/> <result property="customerName" column="customer_name"/> <result property="materialCode" column="material_code"/> <result property="productMaterialId" column="product_material_id"/> <result property="productName" column="product_name"/> <result property="productSpec" column="product_spec"/> <result property="length" column="length"/> @@ -54,6 +55,12 @@ <if test="c.materialCode != null and c.materialCode != '' "> AND pp.material_code LIKE CONCAT('%',#{c.materialCode},'%') </if> <if test="c.startDate != null"> AND pp.start_date >= DATE_FORMAT(#{c.startDate},'%Y-%m-%d') </if> <if test="c.endDate != null"> AND pp.end_date <= DATE_FORMAT(#{c.endDate},'%Y-%m-%d') </if> </select> <select id="selectSummaryByProductType" resultType="com.ruoyi.productionPlan.dto.ProductionPlanSummaryDto">