Parcourir la source

新件转销售

FengChaoYu il y a 8 mois
Parent
commit
535586699b

+ 18 - 0
mall-server-api/src/main/java/com/gree/mall/manager/bean/material/manage/WebsitPartsChangeSalesBean.java

@@ -0,0 +1,18 @@
+package com.gree.mall.manager.bean.material.manage;
+
+import com.gree.mall.manager.plus.entity.WebsitPartsChangeSales;
+import com.gree.mall.manager.plus.entity.WebsitPartsChangeSalesItem;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+@ApiModel
+public class WebsitPartsChangeSalesBean extends WebsitPartsChangeSales {
+
+    @ApiModelProperty("转销售明细")
+    private List<WebsitPartsChangeSalesItem> partsChangeSalesItemList;
+
+}

+ 89 - 0
mall-server-api/src/main/java/com/gree/mall/manager/bean/material/manage/WebsitPartsChangeSalesVO.java

@@ -0,0 +1,89 @@
+package com.gree.mall.manager.bean.material.manage;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.gree.mall.manager.annotation.ZfireField;
+import com.gree.mall.manager.enums.material.PartsOrderFlagEnum;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+@Data
+@ApiModel
+@ZfireField(tbName = "a")
+public class WebsitPartsChangeSalesVO {
+
+    @ApiModelProperty(value = "转销单号")
+    private String changeSalesNo;
+
+    @ApiModelProperty(value = "配件销售订单号")
+    private String salesId;
+
+    @ApiModelProperty(value = "转单类型")
+    private String changeType;
+
+    @ApiModelProperty(value = "总金额")
+    private BigDecimal totalAmount;
+
+    @ZfireField(hide = true)
+    @ApiModelProperty(value = "网点编码")
+    private String companyWechatId;
+
+    @ApiModelProperty(value = "网点名称")
+    private String companyWechatName;
+
+    @ApiModelProperty(value = "网点编码")
+    private String websitId;
+
+    @ApiModelProperty(value = "网点名称")
+    private String websitName;
+
+    @ApiModelProperty(value = "配件网点编号")
+    private String partsWebsitId;
+
+    @ApiModelProperty(value = "师傅身份证")
+    private String identity;
+
+    @ApiModelProperty(value = "师傅编号")
+    private String workerId;
+
+    @ApiModelProperty(value = "师傅名称")
+    private String workerName;
+
+    @ZfireField(hide = true)
+    @ApiModelProperty(value = "销售单流程结束时间")
+    private Date salesEndTime;
+
+    @ApiModelProperty(value = "审批备注")
+    private String examineRemark;
+
+    @ApiModelProperty(value = "单据状态")
+    private PartsOrderFlagEnum flag;
+
+    @ApiModelProperty(value = "创建人")
+    private String createBy;
+
+    @ApiModelProperty(value = "创建时间")
+    private Date createTime;
+
+    @ApiModelProperty(value = "更新人")
+    private String updateBy;
+
+    @ApiModelProperty(value = "更新时间")
+    @TableField("updateTime")
+    private Date updateTime;
+
+    @ApiModelProperty(value = "提交人")
+    private String submitBy;
+
+    @ApiModelProperty(value = "提交时间")
+    private Date submitTime;
+
+    @ApiModelProperty(value = "审核人")
+    private String examineBy;
+
+    @ApiModelProperty(value = "审核时间")
+    private Date examineTime;
+}

+ 1 - 1
mall-server-api/src/main/java/com/gree/mall/manager/bean/material/worker/OldRefundManageVO.java

@@ -27,7 +27,7 @@ public class OldRefundManageVO {
     @ApiModelProperty(value = "申请类别")
     private PartsApplyCategoryEnum applyCategory;
 
-    @ApiModelProperty(value = "申请类型 NEW=新件返还 LOST=破损返还 BUG=故障返还 OLD=旧件返还 NOT=无件返还")
+    @ApiModelProperty(value = "申请类型")
     private PartsRefundApplyTypeEnum applyType;
 
     @ApiModelProperty(value = "返还方式")

+ 10 - 0
mall-server-api/src/main/java/com/gree/mall/manager/commonmapper/MaterialMapper.java

@@ -334,4 +334,14 @@ public interface MaterialMapper {
      * @return
      */
     IPage<OldRefundManageVO> oldRefundManagePage(Page page, @Param("ex") ZfireParamBean zfireParamBean);
+
+    /**
+     * 新件转销列表
+     * @param page
+     * @param zfireParamBean
+     * @return
+     */
+    IPage<WebsitPartsChangeSalesVO> websitPurchaseChangeSalesPage(Page page, @Param("ex") ZfireParamBean zfireParamBean);
+
+    void updateItemPushFlag(@Param("id") String id, @Param("pushFlag") String pushFlag);
 }

+ 1 - 0
mall-server-api/src/main/java/com/gree/mall/manager/constant/Constant.java

@@ -88,6 +88,7 @@ public class Constant {
         public static final String NEW_REFUND = "jsm:parts:new:refund:";
         public static final String PARTS_SALES = "jsm:lock:parts:sales:";
         public static final String WRITE_SALES_ITEM = "jsm:parts:write:sales:item:";
+        public static final String NEW_CHANGE = "jsm:parts:change:sales:";
     }
     public class ChatMessage {
         public final static String MSG_TYPE_DOC = "docmsg";

+ 90 - 0
mall-server-api/src/main/java/com/gree/mall/manager/controller/material/manage/WebsitPartsChangeSalesController.java

@@ -0,0 +1,90 @@
+package com.gree.mall.manager.controller.material.manage;
+
+import cn.hutool.core.lang.TypeReference;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.gree.mall.manager.annotation.ZfireList;
+import com.gree.mall.manager.bean.material.manage.WebsitPartsChangeSalesVO;
+import com.gree.mall.manager.constant.Constant;
+import com.gree.mall.manager.exception.RemoteServiceException;
+import com.gree.mall.manager.helper.ResponseHelper;
+import com.gree.mall.manager.logic.material.manage.WebsitPartsChangeSalesLogic;
+import com.gree.mall.manager.zfire.bean.ZfireParamBean;
+import com.gree.mall.manager.zfire.util.FieldUtils;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.integration.redis.util.RedisLockRegistry;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.locks.Lock;
+
+@Slf4j
+@RestController
+@Api(value = "新件转销售", tags = {"新件转销售"})
+@RequestMapping(value = "/parts/change-sales", produces = "application/json; charset=utf-8")
+public class WebsitPartsChangeSalesController {
+
+    @Resource
+    WebsitPartsChangeSalesLogic websitPartsChangeSalesLogic;
+    @Resource
+    RedisLockRegistry redisLockRegistry;
+
+    @ZfireList
+    @PostMapping("/list")
+    @ApiOperation("新件转销售列表")
+    public ResponseHelper<IPage<WebsitPartsChangeSalesVO>> list(
+            @RequestBody ZfireParamBean zfireParamBean
+    ) throws RemoteServiceException {
+        IPage<WebsitPartsChangeSalesVO> partsBeanIPage = websitPartsChangeSalesLogic.pageList(zfireParamBean);
+        return ResponseHelper.success(partsBeanIPage, new TypeReference<WebsitPartsChangeSalesVO>() {
+        });
+    }
+
+    @PostMapping("/list/export")
+    @ApiOperation("新件转销售导出")
+    public void listExport(
+            @RequestBody ZfireParamBean zfireParamBean,
+            HttpServletRequest request,
+            HttpServletResponse response
+    ) throws Exception {
+        //2.查询要导出的内容
+        IPage<WebsitPartsChangeSalesVO> stockBeanIPage = websitPartsChangeSalesLogic.pageList(zfireParamBean);
+        //3.导出
+        FieldUtils.exportData(stockBeanIPage.getRecords(), zfireParamBean.getExportFields(), request, response);
+    }
+
+    @PostMapping("/detail")
+    @ApiOperation(value = "新件转销售详情")
+    public ResponseHelper detail(
+            @ApiParam(value = "转销单号", required = true) @RequestParam String changeSalesNo
+    ) throws RemoteServiceException {
+        return ResponseHelper.success(websitPartsChangeSalesLogic.detail(changeSalesNo));
+    }
+
+    @PostMapping("/examine")
+    @ApiOperation(value = "新件转销售审批")
+    public ResponseHelper refund(
+            @ApiParam(value = "转销单号", required = true) @RequestParam String changeSalesNo,
+            @ApiParam(value = "审核结果 AGREE=通过 REJECT=驳回", required = true) @RequestParam String flag,
+            @ApiParam(value = "审批备注") @RequestParam(required = false) String examineRemark
+    ) throws Exception {
+        Lock obtain = redisLockRegistry.obtain(Constant.RedisPrefix.NEW_CHANGE + changeSalesNo);
+        try {
+            if (obtain.tryLock(5, TimeUnit.SECONDS)) {
+                websitPartsChangeSalesLogic.examine(changeSalesNo, flag, examineRemark);
+            }
+        } catch (Exception e) {
+            log.error("【新件转销售处理】失败", e);
+            throw e;
+        } finally {
+            obtain.unlock();
+        }
+
+        return ResponseHelper.success();
+    }
+}

+ 155 - 0
mall-server-api/src/main/java/com/gree/mall/manager/logic/material/manage/WebsitPartsChangeSalesLogic.java

@@ -0,0 +1,155 @@
+package com.gree.mall.manager.logic.material.manage;
+
+import cn.hutool.core.date.DateField;
+import cn.hutool.core.date.DateTime;
+import cn.hutool.core.date.DateUtil;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.gree.mall.manager.bean.admin.AdminUserCom;
+import com.gree.mall.manager.bean.material.manage.WebsitPartsChangeSalesBean;
+import com.gree.mall.manager.bean.material.manage.WebsitPartsChangeSalesVO;
+import com.gree.mall.manager.commonmapper.MaterialMapper;
+import com.gree.mall.manager.enums.IsEnum;
+import com.gree.mall.manager.enums.base.BaseEnum;
+import com.gree.mall.manager.enums.material.PartsOrderFlagEnum;
+import com.gree.mall.manager.enums.material.PartsPushFlagEnum;
+import com.gree.mall.manager.exception.RemoteServiceException;
+import com.gree.mall.manager.logic.common.CommonLogic;
+import com.gree.mall.manager.plus.entity.*;
+import com.gree.mall.manager.plus.service.*;
+import com.gree.mall.manager.zfire.bean.ZfireParamBean;
+import com.gree.mall.manager.zfire.util.FieldUtils;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.BeanUtils;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Objects;
+
+@Slf4j
+@Service
+@RequiredArgsConstructor
+public class WebsitPartsChangeSalesLogic {
+
+    private final CommonLogic commonLogic;
+    private final MaterialMapper materialMapper;
+    private final WebsitPartsChangeSalesService websitPartsChangeSalesService;
+    private final WebsitPartsChangeSalesItemService websitPartsChangeSalesItemService;
+    private final AdminWebsitService adminWebsitService;
+    private final WebsitPartsRefundConfigService websitPartsRefundConfigService;
+    private final WebsitPartsSalesService websitPartsSalesService;
+
+    public IPage<WebsitPartsChangeSalesVO> pageList(ZfireParamBean zfireParamBean) {
+        AdminUserCom adminUser = commonLogic.getAdminUser();
+        FieldUtils.materialParam(zfireParamBean, WebsitPartsChangeSalesVO.class, adminUser);
+
+        return materialMapper.websitPurchaseChangeSalesPage(new Page(zfireParamBean.getPageNum(), zfireParamBean.getPageSize()), zfireParamBean);
+    }
+
+    public WebsitPartsChangeSalesBean detail(String changeSalesNo) {
+        WebsitPartsChangeSales partsChangeSales = websitPartsChangeSalesService.lambdaQuery()
+                .eq(WebsitPartsChangeSales::getChangeSalesNo, changeSalesNo)
+                .one();
+        WebsitPartsChangeSalesBean partsChangeSalesBean = new WebsitPartsChangeSalesBean();
+        BeanUtils.copyProperties(partsChangeSales, partsChangeSalesBean);
+
+        List<WebsitPartsChangeSalesItem> partsChangeSalesItems = websitPartsChangeSalesItemService.lambdaQuery()
+                .eq(WebsitPartsChangeSalesItem::getChangeSalesNo, changeSalesNo)
+                .list();
+
+        partsChangeSalesBean.setPartsChangeSalesItemList(partsChangeSalesItems);
+        return partsChangeSalesBean;
+    }
+
+    public void examine(String changeSalesNo, String flag, String examineRemark) {
+        AdminUserCom adminUser = commonLogic.getAdminUser();
+        WebsitPartsChangeSales partsChangeSales = websitPartsChangeSalesService.getById(changeSalesNo);
+        if (!partsChangeSales.getFlag().equals(PartsOrderFlagEnum.SUBMIT.getKey())) {
+            throw new RemoteServiceException(changeSalesNo + "单据状态:"
+                    + BaseEnum.keyToValue(PartsOrderFlagEnum.class, partsChangeSales.getFlag()) + ",失败");
+        }
+
+        if (!(PartsOrderFlagEnum.AGREE.getKey() + "|" + PartsOrderFlagEnum.REJECT.getKey()).contains(flag)) {
+            throw new RemoteServiceException("状态不正确");
+        }
+
+        partsChangeSales.setExamineRemark(examineRemark)
+                .setFlag(flag)
+                .setExamineBy(adminUser.getNickName())
+                .setExamineTime(DateUtil.date());
+        // 更新
+        partsChangeSales.updateById();
+
+        List<WebsitPartsChangeSalesItem> partsChangeSalesItems = websitPartsChangeSalesItemService.lambdaQuery()
+                .eq(WebsitPartsChangeSalesItem::getChangeSalesNo, changeSalesNo)
+                .list();
+
+        if (flag.equals(PartsOrderFlagEnum.AGREE.getKey())) {
+            // 审核通过 师傅临占库存减 转销售库存加
+//            List<WorkerStockDTO> workerStockDTOList = this.createWorkerStockDTO(partsChangeSales, partsChangeSalesItems, PartsRefTypeEnum.CHANGE_SALES.toString(),
+//                    PartsStockPartsAttrEnum.TEMP_NEW.toString(), PartsStockPartsAttrEnum.CHANGE_NEW.toString());
+//            partsStockLogic.handleWorkerStock(workerStockDTOList);
+        } else {
+            // 审核驳回时处理方法
+            this.rejectMethod(partsChangeSales, partsChangeSalesItems, examineRemark);
+        }
+    }
+
+    private void rejectMethod(WebsitPartsChangeSales partsChangeSales, List<WebsitPartsChangeSalesItem> partsChangeSalesItems, String examineRemark) {
+        AdminWebsit shop = adminWebsitService.lambdaQuery()
+                .eq(AdminWebsit::getCompanyWechatId, partsChangeSales.getCompanyWechatId())
+                .eq(AdminWebsit::getWebsitId, partsChangeSales.getWebsitId())
+                .eq(AdminWebsit::getPartsWebsitId, partsChangeSales.getPartsWebsitId())
+                .one();
+        WebsitPartsRefundConfig oneConfig = websitPartsRefundConfigService.lambdaQuery()
+                .eq(WebsitPartsRefundConfig::getCompanyWechatId, partsChangeSales.getCompanyWechatId())
+                .eq(WebsitPartsRefundConfig::getIsDefault, IsEnum.Y.getValue())
+                .one();
+        WebsitPartsRefundConfig partsConfig = websitPartsRefundConfigService.lambdaQuery()
+                .eq(WebsitPartsRefundConfig::getCompanyWechatId, partsChangeSales.getCompanyWechatId())
+                .eq(WebsitPartsRefundConfig::getWebsitId, partsChangeSales.getWebsitId())
+                .one();
+        if (Objects.isNull(shop) || Objects.isNull(shop.getPartsWebsitAttr())) {
+            throw new RemoteServiceException("网点信息异常!操作失败");
+        }
+        // 超期时间
+        Integer expire;
+        if (shop.getPartsWebsitAttr()) {
+            // 内区天数
+            expire = Objects.isNull(partsConfig) ? oneConfig.getNewRefundInner() : partsConfig.getNewRefundInner();
+        } else {
+            // 外区天数
+            expire = Objects.isNull(partsConfig) ? oneConfig.getNewRefundOutside() : partsConfig.getNewRefundOutside();
+        }
+
+        // 更新销售单下推标志和流程结束时间
+        DateTime offsetDateTime = DateUtil.offset(DateUtil.date(), DateField.DAY_OF_MONTH, expire);
+        boolean update = websitPartsSalesService.lambdaUpdate()
+                .set(WebsitPartsSales::getEndTime, offsetDateTime)
+                .set(WebsitPartsSales::getPushFlag, PartsPushFlagEnum.SALES.getKey())
+                .eq(WebsitPartsSales::getId, partsChangeSales.getSalesId())
+                .eq(WebsitPartsSales::getPushFlag, PartsPushFlagEnum.TRANS.getKey())
+                .update();
+
+        if (!update) {
+            throw new RemoteServiceException("更新销售单下推标志和流程结束时间失败");
+        }
+
+        // 更新销售单明细下推标志
+        materialMapper.updateItemPushFlag(partsChangeSales.getSalesId(), PartsPushFlagEnum.SALES.getKey());
+
+        // 保存销售单流程完结时间
+        WebsitPartsSalesRecord partsSalesOrderRecord = new WebsitPartsSalesRecord();
+        partsSalesOrderRecord.setSalesId(partsChangeSales.getSalesId())
+                .setEndTime(partsChangeSales.getSalesEndTime())
+                .setRemark(examineRemark)
+                .setCreateTime(DateUtil.date())
+                .insert();
+
+        // 审核不通过延期 师傅临占库存减 新件库存加
+//        List<WorkerStockDTO> workerStockDTOList = this.createWorkerStockDTO(partsChangeSales, partsChangeSalesItems, PartsRefTypeEnum.CHANGE_SALES.toString(),
+//                PartsStockPartsAttrEnum.TEMP_NEW.toString(), PartsStockPartsAttrEnum.NEW.toString());
+//        partsStockLogic.handleWorkerStock(workerStockDTOList);
+    }
+}

+ 110 - 0
mall-server-api/src/main/java/com/gree/mall/manager/logic/material/manage/WebsitPartsSalesLogic.java

@@ -0,0 +1,110 @@
+package com.gree.mall.manager.logic.material.manage;
+
+import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.date.DateUtil;
+import com.gree.mall.manager.commonmapper.MaterialMapper;
+import com.gree.mall.manager.enums.material.PartsOrderFlagEnum;
+import com.gree.mall.manager.enums.material.PartsPushFlagEnum;
+import com.gree.mall.manager.enums.material.PartsRefTypeEnum;
+import com.gree.mall.manager.logic.common.CommonLogic;
+import com.gree.mall.manager.plus.entity.WebsitPartsChangeSales;
+import com.gree.mall.manager.plus.entity.WebsitPartsChangeSalesItem;
+import com.gree.mall.manager.plus.entity.WebsitPartsSales;
+import com.gree.mall.manager.plus.entity.WebsitPartsSalesItem;
+import com.gree.mall.manager.plus.service.WebsitPartsChangeSalesItemService;
+import com.gree.mall.manager.plus.service.WebsitPartsSalesItemService;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.List;
+
+@Slf4j
+@Service
+@RequiredArgsConstructor
+public class WebsitPartsSalesLogic {
+
+    private final CommonLogic commonLogic;
+    private final MaterialMapper materialMapper;
+    private final WebsitPartsSalesItemService websitPartsSalesItemService;
+    private final WebsitPartsChangeSalesItemService websitPartsChangeSalesItemService;
+
+    public void updatePartsSalesOrder(WebsitPartsSales salesOrder) {
+        String sheetId = commonLogic.generateMaterialNo(salesOrder.getCompanyWechatId(), "ZX", PartsRefTypeEnum.CHANGE_SALES.getKey(), 13);
+
+        List<WebsitPartsSalesItem> partsSalesOrderItemList = websitPartsSalesItemService.lambdaQuery()
+                .eq(WebsitPartsSalesItem::getSalesId, salesOrder.getId())
+                .list();
+
+        List<WebsitPartsChangeSalesItem> partsChangeSalesItemList = new ArrayList<>();
+        BigDecimal totalAmount = BigDecimal.ZERO;
+        for (WebsitPartsSalesItem partsSalesOrderItem : partsSalesOrderItemList) {
+            // 大于0才转明细
+            if (partsSalesOrderItem.getQty().compareTo(BigDecimal.ZERO) > 0) {
+                WebsitPartsChangeSalesItem partsChangeSalesItem = new WebsitPartsChangeSalesItem();
+                partsChangeSalesItem.setChangeSalesNo(sheetId)
+                        .setIdentity(salesOrder.getIdentity())
+                        .setWebsitId(salesOrder.getWebsitId())
+                        .setPartsWebsitId(salesOrder.getPartsWebsitId())
+                        .setPartsNumber(partsSalesOrderItem.getPartsNumber())
+                        .setPartsName(partsSalesOrderItem.getPartsName())
+                        .setMaterialGroupName(partsSalesOrderItem.getMaterialGroupName())
+                        .setGoodsStockUnit(partsSalesOrderItem.getGoodsStockUnit())
+                        .setSalesId(salesOrder.getId())
+                        .setSalesPrice(partsSalesOrderItem.getSalesPrice())
+                        .setMarketPrice(partsSalesOrderItem.getMarketPrice())
+                        .setSecondPrice(partsSalesOrderItem.getSecondPrice())
+                        .setQty(partsSalesOrderItem.getQty())
+                        .setTotalAmount(partsSalesOrderItem.getSalesPrice().multiply(partsSalesOrderItem.getQty()));
+                totalAmount = totalAmount.add(partsChangeSalesItem.getTotalAmount());
+                partsChangeSalesItemList.add(partsChangeSalesItem);
+            }
+        }
+
+        if (CollectionUtil.isEmpty(partsChangeSalesItemList)) {
+            // 如果明细为空 变更为END=完结
+            salesOrder.setPushFlag(PartsPushFlagEnum.END.getKey());
+            salesOrder.updateById();
+            materialMapper.updateItemPushFlag(salesOrder.getId(), PartsPushFlagEnum.END.toString());
+            return;
+        }
+
+        // 变更为TRANS=转销售
+        salesOrder.setPushFlag(PartsPushFlagEnum.TRANS.toString());
+        salesOrder.updateById();
+        materialMapper.updateItemPushFlag(salesOrder.getId(), PartsPushFlagEnum.TRANS.toString());
+
+        WebsitPartsChangeSales partsChangeSales = new WebsitPartsChangeSales();
+
+        partsChangeSales.setChangeSalesNo(sheetId)
+                .setCompanyWechatId(salesOrder.getCompanyWechatId())
+                .setCompanyWechatName(salesOrder.getCompanyWechatName())
+                .setSalesId(salesOrder.getId())
+                .setChangeType(PartsRefTypeEnum.CHANGE_SALES.getKey())
+                .setTotalAmount(totalAmount)
+                .setWebsitId(salesOrder.getWebsitId())
+                .setWebsitName(salesOrder.getWebsitName())
+                .setPartsWebsitId(salesOrder.getPartsWebsitId())
+                .setIdentity(salesOrder.getIdentity())
+                .setWorkerId(salesOrder.getWorkerId())
+                .setWorkerName(salesOrder.getWorkerName())
+                .setSalesEndTime(salesOrder.getEndTime())
+                .setFlag(PartsOrderFlagEnum.SUBMIT.getKey())
+                .setCreateBy("自动处理")
+                .setCreateTime(DateUtil.date())
+                .setUpdateBy("自动处理")
+                .setUpdateTime(DateUtil.date())
+                .setSubmitBy("自动处理")
+                .setSubmitTime(DateUtil.date())
+                .insert();
+
+        websitPartsChangeSalesItemService.saveBatch(partsChangeSalesItemList);
+
+        // 师傅新件库存减 临占新件库存加
+//        List<WorkerStockDTO> workerStockDTOList = this.createWorkerStockDTO(partsChangeSales, partsChangeSalesItemList, PartsRefTypeEnum.CHANGE_SALES.toString(),
+//                PartsStockPartsAttrEnum.NEW.toString(), PartsStockPartsAttrEnum.TEMP_NEW.toString());
+//        partsStockLogic.handleWorkerStock(workerStockDTOList);
+    }
+}

+ 154 - 0
mall-server-api/src/main/java/com/gree/mall/manager/schedule/NewPartsChangeSalesTask.java

@@ -0,0 +1,154 @@
+package com.gree.mall.manager.schedule;
+
+import cn.hutool.core.date.DateField;
+import cn.hutool.core.date.DateTime;
+import cn.hutool.core.date.DateUtil;
+import com.gree.mall.manager.constant.Constant;
+import com.gree.mall.manager.enums.IsEnum;
+import com.gree.mall.manager.enums.admin.AdminWebsitTypeEnum;
+import com.gree.mall.manager.enums.material.BuyPeopleEnum;
+import com.gree.mall.manager.enums.material.PartsPushFlagEnum;
+import com.gree.mall.manager.exception.RemoteServiceException;
+import com.gree.mall.manager.logic.material.manage.WebsitPartsSalesLogic;
+import com.gree.mall.manager.plus.entity.AdminWebsit;
+import com.gree.mall.manager.plus.entity.WebsitPartsChangeSalesExec;
+import com.gree.mall.manager.plus.entity.WebsitPartsRefundConfig;
+import com.gree.mall.manager.plus.entity.WebsitPartsSales;
+import com.gree.mall.manager.plus.service.AdminWebsitService;
+import com.gree.mall.manager.plus.service.WebsitPartsRefundConfigService;
+import com.gree.mall.manager.plus.service.WebsitPartsSalesService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.integration.redis.util.RedisLockRegistry;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.locks.Lock;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+@Component
+@Slf4j
+public class NewPartsChangeSalesTask {
+
+    @Value("${spring.profiles.active}")
+    private String profiles;
+    @Resource
+    AdminWebsitService adminWebsitService;
+    @Resource
+    WebsitPartsRefundConfigService websitPartsRefundConfigService;
+    @Resource
+    WebsitPartsSalesService websitPartsSalesService;
+    @Resource
+    WebsitPartsSalesLogic websitPartsSalesLogic;
+    @Resource
+    RedisLockRegistry redisLockRegistry;
+
+    @Scheduled(cron = "0 0 01 * * ?")
+//    @Scheduled(initialDelay = 5000, fixedDelay = 30000)
+    private void newPartsToSalesTasks() throws InterruptedException {
+        if (profiles.equals("dev") || !DateUtil.formatDateTime(DateUtil.date()).contains(" 01:0")) {
+            return;
+        }
+
+        Lock obtain = redisLockRegistry.obtain(Constant.RedisPrefix.NEW_CHANGE + "add");
+
+        if (!obtain.tryLock(10, TimeUnit.SECONDS)) {
+            throw new RemoteServiceException("获取转销售添加锁失败");
+        }
+        try {
+            // 第一步 查询配件网点
+            List<AdminWebsit> websitList = adminWebsitService.lambdaQuery()
+                    .isNotNull(AdminWebsit::getPartsWebsitId)
+                    .eq(AdminWebsit::getType, AdminWebsitTypeEnum.C.getKey())
+                    .list();
+
+            final Map<String, List<AdminWebsit>> websitGroup = websitList.stream()
+                    .collect(Collectors.groupingBy(AdminWebsit::getCompanyWechatId));
+
+            for (Map.Entry<String, List<AdminWebsit>> entry : websitGroup.entrySet()) {
+                final String companyId = entry.getKey();
+                List<AdminWebsit> shopList = entry.getValue();
+                // 第二步 查询配件返还配置
+                WebsitPartsRefundConfig oneConfig = websitPartsRefundConfigService.lambdaQuery()
+                        .eq(WebsitPartsRefundConfig::getCompanyWechatId, companyId)
+                        .eq(WebsitPartsRefundConfig::getIsDefault, IsEnum.Y.getValue())
+                        .one();
+                List<WebsitPartsRefundConfig> partsConfigs = websitPartsRefundConfigService.lambdaQuery()
+                        .eq(WebsitPartsRefundConfig::getCompanyWechatId, companyId)
+                        .eq(WebsitPartsRefundConfig::getIsDefault, IsEnum.N.getValue())
+                        .list();
+                // 分组网点
+                Map<String, WebsitPartsRefundConfig> refundConfigMap = partsConfigs.stream()
+                        .collect(Collectors.toMap(WebsitPartsRefundConfig::getWebsitId, Function.identity()));
+
+                DateTime curDate = DateUtil.beginOfDay(DateUtil.date());
+                // 第三步 遍历查询已超期网点销售单
+                for (AdminWebsit shop : shopList) {
+                    if (Objects.isNull(shop.getPartsWebsitAttr())) {
+                        // 未指定配件网点属性 false=外区 true内区
+                        continue;
+                    }
+                    WebsitPartsRefundConfig partsConfig = refundConfigMap.get(shop.getWebsitId());
+                    // 超期时间
+                    Integer expire;
+                    if (shop.getPartsWebsitAttr()) {
+                        // 内区天数
+                        expire = Objects.isNull(partsConfig) ? oneConfig.getNewRefundInner() : partsConfig.getNewRefundInner();
+                    } else {
+                        // 外区天数
+                        expire = Objects.isNull(partsConfig) ? oneConfig.getNewRefundOutside() : partsConfig.getNewRefundOutside();
+                    }
+
+                    if (Objects.isNull(expire) || expire.compareTo(1) < 0) {
+                        // 超期时间为空或少于1 不处理
+                        continue;
+                    }
+                    // 查询未转销售单
+                    List<WebsitPartsSales> salesOrders = websitPartsSalesService.lambdaQuery()
+                            .eq(WebsitPartsSales::getCompanyWechatId, companyId)
+                            .eq(WebsitPartsSales::getWebsitId, shop.getWebsitId())
+                            .eq(WebsitPartsSales::getBuyPeople, BuyPeopleEnum.WORKER.getKey())
+                            .eq(WebsitPartsSales::getPartsWebsitId, shop.getPartsWebsitId())
+                            .eq(WebsitPartsSales::getPushFlag, PartsPushFlagEnum.SALES.getKey())
+                            .list();
+                    // 遍历未转销售单
+                    for (WebsitPartsSales salesOrder : salesOrders) {
+                        // 算出销售单超时时间
+                        Date endTime = salesOrder.getEndTime();
+                        DateTime offsetDateTime = DateUtil.offset(endTime, DateField.DAY_OF_MONTH, expire);
+                        DateTime endOfDay = DateUtil.endOfDay(offsetDateTime);
+                        if (endOfDay.getTime() < curDate.getTime()) {
+                            // 销售单超时时间少于当前时间 pushFlag标志转为TRANS
+                            try {
+                                websitPartsSalesLogic.updatePartsSalesOrder(salesOrder);
+                                WebsitPartsChangeSalesExec partsChangeSalesExec = new WebsitPartsChangeSalesExec();
+                                partsChangeSalesExec.setExecTime(DateUtil.date())
+                                        .setInfo("新件转销售作业处理成功,配件销售单:" + salesOrder.getId())
+                                        .insert();
+                            } catch (Exception e) {
+                                WebsitPartsChangeSalesExec partsChangeSalesExec = new WebsitPartsChangeSalesExec();
+                                partsChangeSalesExec.setExecTime(DateUtil.date())
+                                        .setInfo("新件转销售作业处理出错,配件销售单:" + salesOrder.getId())
+                                        .insert();
+                                log.error("新件转销售作业处理出错,配件销售单:" + salesOrder.getId(), e);
+                            }
+                        }
+                    }
+                }
+            }
+        } catch(Exception e) {
+            log.error("【新件转销售处理】失败",e);
+            throw e;
+        } finally {
+            obtain.unlock();
+        }
+
+    }
+}

+ 23 - 0
mall-server-api/src/main/resources/mapper/MaterialMapper.xml

@@ -1,6 +1,10 @@
 <?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.gree.mall.manager.commonmapper.MaterialMapper">
+    <update id="updateItemPushFlag">
+        UPDATE websit_parts_sales_item SET push_flag = #{pushFlag} WHERE sales_id = #{id}
+    </update>
+
     <select id="partsBasePage" resultType="com.gree.mall.manager.bean.material.base.PartsBaseVO">
         SELECT
             ${ex.selected}
@@ -712,4 +716,23 @@
         </if>
         ${ex.orderBy}
     </select>
+
+    <select id="websitPurchaseChangeSalesPage"
+            resultType="com.gree.mall.manager.bean.material.manage.WebsitPartsChangeSalesVO">
+        SELECT
+            ${ex.selected}
+        FROM
+            websit_parts_change_sales a
+        ${ex.query}
+        <if test="ex.adminWebsitIds != null and ex.adminWebsitIds.size > 0">
+            AND a.websit_id IN
+            <foreach item="item" index="index" collection="ex.adminWebsitIds" open="(" separator="," close=")">
+                #{item}
+            </foreach>
+        </if>
+        <if test="ex.orderBy == null or ex.orderBy ==''">
+            ORDER BY a.create_time DESC
+        </if>
+        ${ex.orderBy}
+    </select>
 </mapper>