doc/ÄþÏÄ-ÖÐÊ¢½¨²Ä.sql
@@ -107,3 +107,38 @@ 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 ='ç©æä¿¡æ¯è¡¨é 置表'; 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/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,87 @@ 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 productName; @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/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/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/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/service/impl/ProductionPlanServiceImpl.java
@@ -306,7 +306,7 @@ 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); 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,26 @@ <?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="materialType" column="material_type"/> <result property="inventoryCategory" column="inventory_category"/> <result property="identifierCode" column="identifier_code"/> <result property="materialCode" column="material_code"/> <result property="productName" column="product_name"/> <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>