Răsfoiți Sursa

feat(erp): 新增ERP推送相关实体类及实现商品同步功能

- 新增AddrInfo供应商地址信息实体类
- 新增BusConnDetail业务联系人详细信息实体类
- 新增ComProdInfo产品基础信息推送对象实体类
- 新增ErpAuth ERP API响应基础信息实体类
- 实现ErpPushController ERP数据推送控制器
- 实现商品同步到ERP的功能方法
- 更新商品详情处理逻辑支持协议价格
- 完善商品导入功能支持更新操作
- 优化商品搜索功能支持属性过滤
- 修复发票申请消息处理器中的逻辑问题
- 调整底部导航类型配置项
- 更新订单模块使用商品详情V2接口
肖路 8 ore în urmă
părinte
comite
308025b666

+ 25 - 25
ruoyi-api/ruoyi-api-product/src/main/java/org/dromara/product/api/erp/domain/push/ComProdInfo.java

@@ -20,125 +20,125 @@ public class ComProdInfo implements Serializable {
     /**
      * 产品编号
      */
-    private String prodId;
+    private String ProdId;
 
     /**
      * 产品名称
      */
-    private String prodNm;
+    private String ProdNm;
 
     /**
      * 基本单位
      */
-    private String uid;
+    private String UiId;
 
     /**
      * 产品类别
      */
-    private String prodCatgId;
+    private String ProdCatgId;
 
     /**
      * 产品类型
      */
-    private String typeId;
+    private String TypeId;
 
     /**
      * 规格型号
      */
-    private String prodSpec;
+    private String ProdSpec;
 
     /**
      * UPC条码
      */
-    private String barCd;
+    private String BarCd;
 
     /**
      * 使用交易多单位
      */
-    private Boolean useMultUi;
+    private Boolean UseMultUi;
 
     /**
      * 产品状态
      */
-    private String prodSts;
+    private String ProdSt;
 
     /**
      * 发票名称
      */
-    private String invNm;
+    private String InvNm;
 
     /**
      * 发票规格
      */
-    private String invSpec;
+    private String InvSpec;
 
     /**
      * 单价含税(进价)
      */
-    private Boolean purIsPrWtTax;
+    private Boolean PurIsPrWTax;
 
     /**
      * 标准进价
      */
-    private BigDecimal purStdPr;
+    private BigDecimal PurStdPr;
 
     /**
      * 最高进价
      */
-    private BigDecimal highPurPr;
+    private BigDecimal HighPurPr;
 
     /**
      * 主供应商
      */
-    private String supId;
+    private String SupId;
 
     /**
      * 税码(进价)
      */
-    private String purTaxId;
+    private String PurTaxId;
 
     /**
      * 单价含税(售价)
      */
-    private Boolean slsIsPrWtTax;
+    private Boolean SlIsPrWTax;
 
     /**
      * 标准售价
      */
-    private BigDecimal slsStdPr;
+    private BigDecimal SlStdPr;
 
     /**
      * 最低售价
      */
-    private BigDecimal minPr;
+    private BigDecimal MinPr;
 
     /**
      * 税码(售价)
      */
-    private String sltTaxId;
+    private String SlTaxId;
 
     /**
      * 备注
      */
-    private String remark;
+    private String Remark;
 
     /**
      * 品牌资料
      */
-    private String tradMrkId;
+    private String TradMrkId;
 
     /**
      * 最低销售量
      */
-    private BigDecimal minSalQty;
+    private BigDecimal MinSalQty;
 
     /**
      * 采购员
      */
-    private String purPerId;
+    private String PurPerId;
 
     /**
      * 备货属性
      */
-    private String cuBhsx;
+    private String CU_BHSX;
 }

+ 11 - 2
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/impl/SupplierInfoServiceImpl.java

@@ -494,7 +494,13 @@ public class SupplierInfoServiceImpl extends ServiceImpl<SupplierInfoMapper, Sup
         supInfo.setFaxNum(supplierVo.getFax()); // 传真号码
         supInfo.setBusphone(supplierVo.getFixedPhone()); // 办公电话
         supInfo.setAddr(supplierVo.getOfficeAddress()); // 联系地址
-        supInfo.setType(String.valueOf(supplierVo.getSupplierType())); // 类别 -> 供应商类型
+
+        if (ObjectUtil.isNotEmpty(supplierVo.getSupplierType())) {
+            RemoteSupplierTypeVo typeVo = remoteSupplierTypeService.selectByTypeId(supplierVo.getSupplierType());
+            if (typeVo != null) {
+                supInfo.setType(typeVo.getSupplierTypeNo()); // 类别 -> 供应商类型
+            }
+        }
         supInfo.setCountryId(supplierVo.getBusinessProvince()); // 国家/地区 -> 省份(注册地址)
         supInfo.setPrvnId(supplierVo.getOfficeProvince()); // 省份 -> 办公地址省
         supInfo.setCityId(supplierVo.getOfficeCity()); // 城市 -> 办公地址市
@@ -560,7 +566,10 @@ public class SupplierInfoServiceImpl extends ServiceImpl<SupplierInfoMapper, Sup
 
             // 供应商等级
             if (StringUtils.isNotBlank(supplierVo.getCooperateLevel())) {
-                supInfo.setGadId(supplierVo.getCooperateLevel());
+                RemoteSupplierLevelVo levelVo = remoteSupplierLevelService.selectByLevelId(Long.valueOf(supplierVo.getCooperateLevel()));
+                if (levelVo != null) {
+                    supInfo.setGadId(levelVo.getSupplierLevelNo());
+                }
             }
         }
 

+ 29 - 15
ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/erp/ErpPushController.java

@@ -39,11 +39,9 @@ public class ErpPushController {
     /**
     * 认证
     * */
-    public ErpAuth auth() {
+    public ErpAuth auth(String time,String sign) {
         log.info("认证开始...");
         //发送请求的utc时间年月日时分秒共14位
-        String time = DateUtil.format(DateUtil.date(), "yyyyMMddHHmmss");
-        String sign = getSign(time);
 
         Map<String, String> map = new HashMap<>();
         map.put("appid", APPID);
@@ -57,9 +55,9 @@ public class ErpPushController {
 
 
     /**
-    * 获取签名信息
+    * 获取认证签名信息
     **/
-    private String getSign(String time) {
+    private String getAuthSign(String time) {
         //签名,
         //appid+appsecret+token+time 进行md5加密;32位大写
         String sign = SecureUtil.md5(APPID + AppSecret + time).toUpperCase();
@@ -71,17 +69,19 @@ public class ErpPushController {
     * */
     @PostMapping("/add")
     public String add(String progId, String data) {
-        log.info("新增数据开始...");
         String time = DateUtil.format(DateUtil.date(), "yyyyMMddHHmmss");
-        String sign = getSign(time);
-        ErpAuth auth = this.auth();
+        String sign = getAuthSign(time);
+        log.info("新增数据开始...time:{},sign:{},data:{}", time, sign,data);
+        ErpAuth auth = this.auth(time, sign);
         Map<String, Object> map = new HashMap<>();
         map.put("token", auth.getToken());
-        map.put("sign", sign);
+        map.put("sign", this.getSign(auth.getToken(), time));
         map.put("time", time);
         map.put("progId",progId);
-        map.put("data", data);
+        map.put("data", JSONUtil.parseObj(data));
+        log.info("新增数据传参...json:{}", JSONUtil.toJsonStr(map));
         String post = HttpUtil.post(url + "/esb/erp/addnew.do", JSONUtil.toJsonStr(map));
+        log.info("新增数据结果:{}", post);
         return "新增数据成功";
     }
 
@@ -90,21 +90,35 @@ public class ErpPushController {
     * */
     @PostMapping("/update")
     public String update(String progId, String data) {
-        log.info("更新数据开始...");
+
         String time = DateUtil.format(DateUtil.date(), "yyyyMMddHHmmss");
-        String sign = getSign(time);
-        ErpAuth auth = this.auth();
+        String sign = getAuthSign(time);
+        log.info("更新数据开始...time:{},sign:{},data:{}", time, sign,data);
+        ErpAuth auth = this.auth(time, sign);
         Map<String, Object> map = new HashMap<>();
         map.put("token", auth.getToken());
-        map.put("sign", sign);
+        map.put("sign", this.getSign(auth.getToken(), time));
         map.put("time", time);
         map.put("progId",progId);
-        map.put("data", data);
+        map.put("data", JSONUtil.parseObj(data));
+        log.info("更新数据传参...json:{}", JSONUtil.toJsonStr(map));
         String post = HttpUtil.post(url + "/esb/erp/update.do", JSONUtil.toJsonStr(map));
+        log.info("更新数据结果:{}", post);
         return "更新数据成功";
     }
 
+    /**
+    * 获取业务签名信息
+    * */
+    private String getSign(String token,String time) {
+        //签名,
+        //appid+appsecret+token+time 进行md5加密;32位大写
+        String sign = SecureUtil.md5(token + AppSecret + time).toUpperCase();
+        return sign;
+    }
+
     public static void main(String[] args) {
+        HttpUtil.get("http://119.97.180.91:890/esb/erp/update.do");
     }
 
 }

+ 3 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/service/impl/ProductBaseAuditServiceImpl.java

@@ -361,6 +361,9 @@ public class ProductBaseAuditServiceImpl extends ServiceImpl<ProductBaseAuditMap
                 // 有productId,说明是编辑商品,需要还原数据后调用商品编辑
                 handleEditProduct(productBaseVo, productId);
             }
+            if(productBaseVo.getIsSelf()==1){
+                productBaseService.syncProductToErp(productId,true);
+            }
         }
         if(type == 1) {
             // type=1: 上下架审核,改变商品上下架状态

+ 31 - 23
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/service/impl/ProductBaseServiceImpl.java

@@ -1046,16 +1046,6 @@ public class ProductBaseServiceImpl extends ServiceImpl<ProductBaseMapper, Produ
      */
     private void updateProductPriceInventory(ProductBaseBo bo, Long productId) {
         // 如果没有传价格相关信息,不做任何操作
-        if (bo.getMarketPrice() == null && bo.getMemberPrice() == null &&
-            bo.getMinSellingPrice() == null && bo.getPurchasingPrice() == null &&
-            bo.getMaxPurchasePrice() == null && bo.getTotalInventory() == null &&
-            bo.getNowInventory() == null && bo.getVirtualInventory() == null &&
-            bo.getTaxRate() == null && bo.getTaxationId() == null &&
-            bo.getSupplyPrice() == null && bo.getSupplyValidityPeriod() == null &&
-            bo.getSupplyPostStatus() == null
-            ) {
-            return;
-        }
 
         ProductPriceInventory existing = priceInventoryMapper.selectById(productId);
         if (existing != null) {
@@ -1073,6 +1063,7 @@ public class ProductBaseServiceImpl extends ServiceImpl<ProductBaseMapper, Produ
             if (bo.getSupplyPrice() != null) existing.setSupplyPrice(bo.getSupplyPrice());
             if (bo.getSupplyValidityPeriod() != null) existing.setSupplyValidityPeriod(bo.getSupplyValidityPeriod());
             if (bo.getSupplyPostStatus() != null) existing.setSupplyPostStatus(bo.getSupplyPostStatus());
+            if (bo.getMinOrderQuantity() != null) existing.setMinOrderQuantity(bo.getMinOrderQuantity());
             priceInventoryMapper.updateById(existing);
         } else {
             // 创建新记录
@@ -1449,39 +1440,56 @@ public class ProductBaseServiceImpl extends ServiceImpl<ProductBaseMapper, Produ
                 ComProdInfo erpProduct = new ComProdInfo();
                 erpProduct.setProdId(vo.getProductNo());
                 erpProduct.setProdNm(vo.getItemName());
-                erpProduct.setUid(vo.getUnitId());
-                erpProduct.setProdCatgId(vo.getBottomCategoryId() != null ? vo.getBottomCategoryId().toString() : null);
-                erpProduct.setTypeId(vo.getProductCategory() != null ? vo.getProductCategory().toString() : null);
+                if (ObjectUtil.isNotEmpty(vo.getUnitId()) && !isUpdate) {
+                    ProductUnitVo productUnitVo = unitMapper.selectVoById(vo.getUnitId());
+                    if (ObjectUtil.isNotEmpty(productUnitVo)){
+                        erpProduct.setUiId(productUnitVo.getUnitNo());
+                    }
+                }
+                if (ObjectUtil.isNotEmpty(vo.getBottomCategoryId())) {
+                    ProductCategoryVo productCategoryVo = categoryMapper.selectVoById(vo.getBottomCategoryId());
+                    if (ObjectUtil.isNotEmpty(productCategoryVo)){
+                        erpProduct.setProdCatgId(productCategoryVo.getCategoryNo());
+                    }
+                }
+                erpProduct.setTypeId("0001");
                 erpProduct.setProdSpec(vo.getSpecification());
                 erpProduct.setBarCd(vo.getBarCoding());
                 erpProduct.setUseMultUi(false); // 默认不使用多单位
 
-                // 产品状态映射:1=已上架,0=下架 -> ERP 状态可能需要转换,这里暂存字符串
-                erpProduct.setProdSts(vo.getProductStatus() != null ? vo.getProductStatus().toString() : "0");
+                // 产品状态
+                erpProduct.setProdSt("01");
 
                 erpProduct.setInvNm(vo.getInvoiceName());
                 erpProduct.setInvSpec(vo.getInvoiceSpecs());
 
                 // 价格相关
-                erpProduct.setPurIsPrWtTax(true); // 假设进价含税,可根据业务调整
+                erpProduct.setPurIsPrWTax(true); // 假设进价含税,可根据业务调整
                 erpProduct.setPurStdPr(vo.getPurchasingPrice());
                 erpProduct.setHighPurPr(vo.getMaxPurchasePrice());
                 erpProduct.setSupId(vo.getSupplierNo());
-                erpProduct.setPurTaxId(vo.getTaxCode());
+                erpProduct.setPurTaxId("VT000");
 
-                erpProduct.setSlsIsPrWtTax(true); // 假设售价含税
-                erpProduct.setSlsStdPr(vo.getMemberPrice());
+                erpProduct.setSlIsPrWTax(true); // 假设售价含税,可根据业务调整
+                erpProduct.setSlStdPr(vo.getMemberPrice());
                 erpProduct.setMinPr(vo.getMinSellingPrice());
-                erpProduct.setSltTaxId(vo.getTaxCode());
+                erpProduct.setPurTaxId("VT000");
 
                 erpProduct.setRemark(vo.getRemark());
-                erpProduct.setTradMrkId(vo.getBrandId() != null ? vo.getBrandId().toString() : null);
+                if (ObjectUtil.isNotEmpty(vo.getBrandId())) {
+                    ProductBrandVo productBrandVo = brandMapper.selectVoById(vo.getBrandId());
+                    if (ObjectUtil.isNotEmpty(productBrandVo)){
+                        erpProduct.setTradMrkId(productBrandVo.getBrandNo());
+                    }
+                }
                 erpProduct.setMinSalQty(vo.getMinOrderQuantity() != null ? BigDecimal.valueOf(vo.getMinOrderQuantity()) : null);
                 erpProduct.setPurPerId(vo.getPurchaseManagerNo());
-                erpProduct.setCuBhsx("1"); // 备货属性,根据实际业务设置
+                erpProduct.setCU_BHSX("0004"); // 备货属性,根据实际业务设置
 
+                Map<String, ComProdInfo> map = new HashMap<>();
+                map.put("ComProdInfo", erpProduct);
                 // 调用远程服务推送
-                String productJson = JSONUtil.toJsonStr(erpProduct);
+                String productJson = JSONUtil.toJsonStr(map);
                 erpPushService.pushProductData(productJson, isUpdate);
 
                 log.debug("成功{}ERP产品索引,产品ID: {}", isUpdate ? "更新" : "插入", productId);

+ 1 - 1
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/service/impl/ProductPoolAuditServiceImpl.java

@@ -501,7 +501,7 @@ public class ProductPoolAuditServiceImpl  extends ServiceImpl<ProductPoolAuditMa
                     .in(ProductBaseVo::getId, updateProductIds)
                 );
                 for (Long updateProductId : updateProductIds) {
-                    productBaseService.syncProductToErp(updateProductId,true);
+                    productBaseService.syncProductToErp(updateProductId,false);
                 }
             }
             if(ObjectUtil.isNotEmpty(deleteProductIds)){