diff --git a/src/main/java/com/qs/serve/modules/goods/controller/GoodsSyncController.java b/src/main/java/com/qs/serve/modules/goods/controller/GoodsSyncController.java new file mode 100644 index 00000000..8b259d2c --- /dev/null +++ b/src/main/java/com/qs/serve/modules/goods/controller/GoodsSyncController.java @@ -0,0 +1,29 @@ +package com.qs.serve.modules.goods.controller; + +import com.qs.serve.common.model.dto.R; +import com.qs.serve.modules.goods.service.GoodsApplicationService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * @author YenHex + * @since 2023/11/22 + */ +@Slf4j +@AllArgsConstructor +@RestController +@RequestMapping("goods/sync") +public class GoodsSyncController { + + private GoodsApplicationService goodsApplicationService; + + @GetMapping("/stand") + public R toStandList(Integer fullUpdate){ + goodsApplicationService.syncStandGoods(fullUpdate!=null&&fullUpdate==1); + return R.ok(); + } + +} diff --git a/src/main/java/com/qs/serve/modules/goods/entity/GoodsSpu.java b/src/main/java/com/qs/serve/modules/goods/entity/GoodsSpu.java index c765652a..9289edc6 100644 --- a/src/main/java/com/qs/serve/modules/goods/entity/GoodsSpu.java +++ b/src/main/java/com/qs/serve/modules/goods/entity/GoodsSpu.java @@ -122,7 +122,7 @@ public class GoodsSpu implements Serializable { /** 展示的价格 */ @TableField(exist = false) - private Double showPrice = 123D; + private Double showPrice = 0D; /** 选中的类目ID */ @TableField(exist = false) diff --git a/src/main/java/com/qs/serve/modules/goods/entity/bo/GoodsCategoryTreeVo.java b/src/main/java/com/qs/serve/modules/goods/entity/bo/GoodsCategoryTreeVo.java index 08c68216..3b6631ae 100644 --- a/src/main/java/com/qs/serve/modules/goods/entity/bo/GoodsCategoryTreeVo.java +++ b/src/main/java/com/qs/serve/modules/goods/entity/bo/GoodsCategoryTreeVo.java @@ -31,6 +31,12 @@ public class GoodsCategoryTreeVo extends TreeNode { @Length(max = 32,message = "父分类编号长度不能超过32字") private String parentId; + /** 等级路径id */ + private String levelPath; + + /** 等级路径 */ + private String levelPathNames; + /** 名称 */ @Length(max = 16,message = "名称长度不能超过16字") private String name; diff --git a/src/main/java/com/qs/serve/modules/goods/entity/dto/StandInventory.java b/src/main/java/com/qs/serve/modules/goods/entity/dto/StandInventory.java new file mode 100644 index 00000000..7e99f717 --- /dev/null +++ b/src/main/java/com/qs/serve/modules/goods/entity/dto/StandInventory.java @@ -0,0 +1,34 @@ +package com.qs.serve.modules.goods.entity.dto; + +import lombok.Data; + +/** + * @author YenHex + * @since 2023/11/21 + */ +@Data +public class StandInventory { + + private String id; + private String invCode; + private String invName; + private String invSku; + private String invSkuCode; + private String invSeries; + private String invCategory; + private String invBrand; + private String invOrderStatus; + private String invCostStatus; + private String chestCasing; + private String invUnitWeight; + private String invUnit; + private String invVolume; + private String invWeight; + private String invGrossWeight; + private String invPlace; + private String invTaste; + private String invStartDate; + private String invEndDate; + private String rowCreateTime; + +} diff --git a/src/main/java/com/qs/serve/modules/goods/mapper/GoodsCrmSkuMapper.java b/src/main/java/com/qs/serve/modules/goods/mapper/GoodsCrmSkuMapper.java new file mode 100644 index 00000000..9e041d03 --- /dev/null +++ b/src/main/java/com/qs/serve/modules/goods/mapper/GoodsCrmSkuMapper.java @@ -0,0 +1,100 @@ +package com.qs.serve.modules.goods.mapper; + +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Update; + +import java.util.List; + +/** + * @author YenHex + * @since 2023/11/21 + */ +public interface GoodsCrmSkuMapper { + + /** + * 上架商品 + * @param codes + * @return + */ + @Update("") + int updateShelfOnInCodes(@Param("invCodes")List codes); + + /** + * 下架商品 + * @param codes + * @return + */ + @Update("") + int updateShelfOffNotInCodes(@Param("invCodes")List codes); + + + /** + * 设置非特殊品 + * @param codes + * @return + */ + @Update("") + int updateSpecialNotInCodes(@Param("invCodes")List codes); + + /** + * 设置特殊品 + * @param codes + * @return + */ + @Update("") + int updateSpecialInCodes(@Param("invCodes")List codes); + + /** + * 根据sku修改spu非特殊品 + * @return + */ + @Update("update goods_spu set goods_spu.special_sku_id = 0 " + + "where goods_spu.id not in ( " + + " select spu_id from goods_sku where goods_spu.special_sku_id is not null and goods_spu.special_sku_id !=0 )") + int updateSpuSpecialIdBySku(); + + /** + * 根据sku状态,更新spu上架状态 + * @return + */ + @Update("update goods_spu set shelf = 0 where goods_spu.id not in ( " + + " select goods_sku.spu_id from goods_sku where goods_sku.`enable` = 1 " + + ") ") + int updateSpuShelfBySku(); + + //设置错误的产地,下架 + //select concat(spu_id,'_',belong) tmp,count(1) from goods_sku where `enable` = 1 and special_flag = 0 group by tmp HAVING count(1)>1 + + /** + * 根据sku是否特殊商品更新spu特殊商品标识 + * @return + */ + @Update("update goods_spu " + + " left join " + + " (select goods_sku.spu_id,goods_sku.id as sku_id from goods_sku where goods_sku.`enable` = 1 and special_flag = 1) sku_tmp" + + " on sku_tmp.spu_id = goods_spu.id" + + " set goods_spu.special_sku_id = sku_tmp.sku_id " + + " where sku_tmp.sku_id is not null ") + int updateSpuSpecSkuId(); + +} diff --git a/src/main/java/com/qs/serve/modules/goods/service/GoodsApplicationService.java b/src/main/java/com/qs/serve/modules/goods/service/GoodsApplicationService.java index 39a8e8f7..fd14aea5 100644 --- a/src/main/java/com/qs/serve/modules/goods/service/GoodsApplicationService.java +++ b/src/main/java/com/qs/serve/modules/goods/service/GoodsApplicationService.java @@ -1,5 +1,10 @@ package com.qs.serve.modules.goods.service; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.qs.serve.common.model.dto.R; +import com.qs.serve.common.util.AuthContextUtils; +import com.qs.serve.common.util.JsonUtil; +import com.qs.serve.common.util.StringUtils; import com.qs.serve.modules.bms.service.BmsChannelPointService; import com.qs.serve.modules.bms.service.BmsChannelService; import com.qs.serve.modules.bms.service.BmsSubjectService; @@ -9,15 +14,19 @@ import com.qs.serve.modules.goods.entity.GoodsSku; import com.qs.serve.modules.goods.entity.GoodsSpu; import com.qs.serve.modules.goods.entity.dto.GoodTargetParam; import com.qs.serve.modules.goods.entity.dto.GoodsTargetInfo; +import com.qs.serve.modules.goods.entity.dto.StandInventory; +import com.qs.serve.modules.goods.mapper.GoodsCrmSkuMapper; +import com.qs.serve.modules.seeyon.service.impl.SeeYonRequestBaseService; import com.qs.serve.modules.tbs.common.TbsGoodsType; +import com.qs.serve.modules.tbs.common.TbsSeeYonConst; import com.qs.serve.modules.tbs.entity.TbsActivityGoods; import com.qs.serve.modules.tbs.entity.bo.TbsActivityGoodsBo; import lombok.AllArgsConstructor; import org.springframework.stereotype.Service; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; +import java.math.BigDecimal; +import java.util.*; +import java.util.stream.Collectors; /** * @author YenHex @@ -31,8 +40,127 @@ public class GoodsApplicationService { private final GoodsSkuService goodsSkuService; private final GoodsSpuService goodsSpuService; private final GoodsCategoryService goodsCategoryService; + private final SeeYonRequestBaseService seeYonRequestBaseService; + private final GoodsCrmSkuMapper goodsCrmSkuMapper; + public void syncStandGoods(boolean isFullUpdate){ + //兼容任务调度 + AuthContextUtils.setTenant("001"); + //获取stand表的存货 + R result = seeYonRequestBaseService.getBase(TbsSeeYonConst.ERP_CUS_INV_STAND,""); + String listJson = result.getData(); + List inventoryList = JsonUtil.jsonToList(listJson,StandInventory.class); + + List spuCodes = inventoryList.stream().map(StandInventory::getInvSkuCode).distinct().collect(Collectors.toList()); + List skuCodes = inventoryList.stream().map(StandInventory::getInvCode).distinct().collect(Collectors.toList()); + LambdaQueryWrapper spuLqw = new LambdaQueryWrapper<>(); + spuLqw.select(GoodsSpu::getId,GoodsSpu::getSpuCode); + spuLqw.in(GoodsSpu::getSpuCode,spuCodes); + List goodsSpuList = goodsSpuService.list(spuLqw); + Map spuCodeGetIdMap = new HashMap<>(); + for (GoodsSpu spu : goodsSpuList) { + spuCodeGetIdMap.put(spu.getSpuCode(),spu.getId()); + } + + LambdaQueryWrapper skuLqw = new LambdaQueryWrapper<>(); + skuLqw.select(GoodsSku::getId,GoodsSku::getSkuCode); + skuLqw.in(GoodsSku::getSkuCode,skuCodes); + List skus = goodsSkuService.list(skuLqw); + Map skuCodeGetIdMap = new HashMap<>(); + for (GoodsSku sku : skus) { + skuCodeGetIdMap.put(sku.getSkuCode(),sku.getId()); + } + + //更新sku + for (StandInventory inventory : inventoryList) { + + //空值 默认开平 + if(inventory.getInvPlace()==null){ + inventory.setInvPlace("开平"); + } + //开平康力 改 康力 + if("开平康力".equals(inventory.getInvPlace())){ + inventory.setInvPlace("康力"); + } + //移除产字眼 + inventory.setInvPlace(inventory.getInvPlace().replace("产","")); + + Long skuId = skuCodeGetIdMap.get(inventory.getInvCode()); + Long spuId = spuCodeGetIdMap.get(inventory.getInvSkuCode()); + if(!isFullUpdate&&skuId!=null){ + continue; + } + if(spuId==null){ + //add new spu + GoodsSpu spu = new GoodsSpu(); + spu.setId(spuId); + spu.setSpuCode(inventory.getInvSkuCode()); + spu.setName(inventory.getInvSku()); + //匹配类目 + LambdaQueryWrapper cateLqw = new LambdaQueryWrapper<>(); + cateLqw.likeRight(GoodsCategory::getLevelPathNames,inventory.getInvBrand()) + .likeLeft(GoodsCategory::getLevelPathNames,inventory.getInvSeries()) + .like(GoodsCategory::getLevelPathNames,inventory.getInvCategory()); + List categoryList = goodsCategoryService.list(cateLqw); + if(categoryList.size()>0){ + GoodsCategory goodsCategory = categoryList.get(0); + String[] cateIds = goodsCategory.getLevelPath().split("_"); + if(cateIds.length>2){ + spu.setCategoryFirst(cateIds[0]); + spu.setCategorySecond(cateIds[1]); + spu.setCategoryThird(cateIds[2]); + spu.setCategoryLast(cateIds[2]); + } + } + if(spu.getCategoryFirst()==null) { + spu.setCategoryFirst("1"); + spu.setCategorySecond("2"); + spu.setCategoryThird("3"); + spu.setCategoryLast("3"); + } + + spu.setShelf(1); + spu.setOrderFlag(Integer.parseInt(inventory.getInvOrderStatus())); + spu.setCostFlag(Integer.parseInt(inventory.getInvCostStatus())); + goodsSpuService.save(spu); + //防止多次保存 + spuId = spu.getId(); + spuCodeGetIdMap.put(spu.getSpuCode(),spuId); + } + GoodsSku sku = new GoodsSku(); + sku.setId(skuId); + sku.setSkuCode(inventory.getInvCode()); + sku.setSkuName(inventory.getInvName()); + sku.setSpuId(spuId); + sku.setSpecInfos(inventory.getInvPlace()+";"+inventory.getInvTaste()+";"+inventory.getChestCasing()); + if(StringUtils.hasText(inventory.getInvWeight())){ + sku.setWeight(new BigDecimal(inventory.getInvWeight())); + } + if(StringUtils.hasText(inventory.getInvVolume())){ + sku.setVolume(new BigDecimal(inventory.getInvVolume())); + } + sku.setOrderFlag(Integer.parseInt(inventory.getInvOrderStatus())); + sku.setUnitId(0L); + sku.setUnitName(inventory.getInvUnit()); + sku.setBelong(inventory.getInvPlace()); + sku.setWrapVal(inventory.getChestCasing()); + sku.setTasteVal(inventory.getInvTaste()); + sku.setCostFlag(Integer.parseInt(inventory.getInvCostStatus())); + if(sku.getId()==null){ + sku.setSalesPrice(BigDecimal.ZERO); + sku.setMarketPrice(BigDecimal.ZERO); + sku.setCostPrice(BigDecimal.ZERO); + goodsSkuService.save(sku); + }else { + goodsSkuService.updateById(sku); + } + } + //更新商品状态 + seeYonRequestBaseService.getBase(TbsSeeYonConst.ERP_CUS_INV_SPECIAL,""); + seeYonRequestBaseService.getBase(TbsSeeYonConst.ERP_CUS_INV_SHELF,""); + } + public GoodsTargetInfo getGoodsTargetInfo(String goodsType,Long goodsIds){ List list = this.getGoodsTargetInfo(goodsType, Arrays.asList(goodsIds)); if(list.size()>0){ diff --git a/src/main/java/com/qs/serve/modules/tbs/common/TbsSeeYonConst.java b/src/main/java/com/qs/serve/modules/tbs/common/TbsSeeYonConst.java index 97e89e2a..5e4bedc7 100644 --- a/src/main/java/com/qs/serve/modules/tbs/common/TbsSeeYonConst.java +++ b/src/main/java/com/qs/serve/modules/tbs/common/TbsSeeYonConst.java @@ -89,6 +89,9 @@ public interface TbsSeeYonConst { /** 客户账单余额 */ String ERP_CUS_AMOUNT = "/erp/customer/amount"; String ERP_CUS_INV_PRICE = "/erp/inventory/invPrices"; + String ERP_CUS_INV_STAND = "/erp/inventory/standList"; + String ERP_CUS_INV_SPECIAL = "/erp/inventory/specialSyncCrm"; + String ERP_CUS_INV_SHELF = "/erp/inventory/shelfSyncCrm"; String ERP_ORDER_CREATE = "/erp/order/create"; String ERP_ORDER_STATUS = "/erp/order/getStatus"; String ERP_ORDER_CANCEL = "/erp/order/cancelOrder"; diff --git a/src/main/java/com/qs/serve/modules/tbs/controller/TbsCostApplyController.java b/src/main/java/com/qs/serve/modules/tbs/controller/TbsCostApplyController.java index 9b46ed82..31ede8a2 100644 --- a/src/main/java/com/qs/serve/modules/tbs/controller/TbsCostApplyController.java +++ b/src/main/java/com/qs/serve/modules/tbs/controller/TbsCostApplyController.java @@ -457,10 +457,20 @@ public class TbsCostApplyController { * @return */ @GetMapping("/listBudgetInfo") - public R> listBudgetInfo(String costApplyId){ + public R> listBudgetInfo(String costApplyId,String policyId){ LambdaQueryWrapper loadCostLogLqw = new LambdaQueryWrapper<>(); - loadCostLogLqw.eq(TbsBudgetLog::getCostApplyId,costApplyId); + if(costApplyId!=null){ + loadCostLogLqw.eq(TbsBudgetLog::getCostApplyId,costApplyId); + }else if(policyId!=null){ + loadCostLogLqw.eq(TbsBudgetLog::getPolicyId,policyId); + }else { + return R.error("error params"); + } List costApplyBudgetLogs = tbsBudgetLogService.list(loadCostLogLqw); + if(costApplyBudgetLogs.size()<1){ + return R.ok(); + } + Map> groupCurrentMap = costApplyBudgetLogs.stream().collect(Collectors.groupingBy(TbsBudgetLog::getScheduleItemBudgetId)); List budgetIds = costApplyBudgetLogs.stream().map(TbsBudgetLog::getBudgetId).distinct().collect(Collectors.toList()); List resultInfoList = new ArrayList<>(); for (Long budgetId : budgetIds) { @@ -479,7 +489,17 @@ public class TbsCostApplyController { for (TbsCostBudgetRelateInfo info : relateInfoList) { for (TbsScheduleItemBudget itemBudget : scheduleItemBudgetList) { if(info.getScheduleItemBudgetId().equals(itemBudget.getId())){ - info.setScheduleName(itemBudget.getItemName()); + info.setScheduleItemName(itemBudget.getItemName()); + //关联当前项 + List budgetLogList = groupCurrentMap.get(itemBudget.getId()); + BigDecimal currentAmt = BigDecimal.ZERO; + if(budgetLogList!=null){ + for (TbsBudgetLog budgetLog : budgetLogList) { + //log负数,取正数 + currentAmt = currentAmt.add(budgetLog.getAmount().negate()); + } + } + info.setCurrentItemAmt(currentAmt); break; } } diff --git a/src/main/java/com/qs/serve/modules/tbs/entity/dto/TbsCostBudgetRelateInfo.java b/src/main/java/com/qs/serve/modules/tbs/entity/dto/TbsCostBudgetRelateInfo.java index 078d810e..32b43fc7 100644 --- a/src/main/java/com/qs/serve/modules/tbs/entity/dto/TbsCostBudgetRelateInfo.java +++ b/src/main/java/com/qs/serve/modules/tbs/entity/dto/TbsCostBudgetRelateInfo.java @@ -18,6 +18,9 @@ public class TbsCostBudgetRelateInfo extends TbsBudgetScheduleWithAmount{ String budgetTitle; /** 周期名称 */ - String scheduleName; + String scheduleItemName; + + /** 当前政策或费用占用 */ + BigDecimal currentItemAmt; } diff --git a/src/main/resources/mapper/goods/GoodsSkuMapper.xml b/src/main/resources/mapper/goods/GoodsSkuMapper.xml index 96c7baeb..d1d10f32 100644 --- a/src/main/resources/mapper/goods/GoodsSkuMapper.xml +++ b/src/main/resources/mapper/goods/GoodsSkuMapper.xml @@ -57,6 +57,7 @@ goods_sku.`create_by`, goods_sku.`cost_flag`, goods_sku.`update_by`, + goods_sku.`special_flag`, goods_sku.`belong` diff --git a/src/main/resources/mapper/goods/GoodsSpuMapper.xml b/src/main/resources/mapper/goods/GoodsSpuMapper.xml index 99206b35..04d6c1ea 100644 --- a/src/main/resources/mapper/goods/GoodsSpuMapper.xml +++ b/src/main/resources/mapper/goods/GoodsSpuMapper.xml @@ -51,6 +51,7 @@ goods_spu.`tenant_id`, goods_spu.`cost_flag`, goods_spu.`del_flag`, + goods_spu.`special_sku_id`, goods_spu.`belong`