cl
6 天以前 54794979fc9ad0aacf21f4e47a84c24e8f675251
重发按钮权限
7个文件已修改
128 ■■■■■ 已修改文件
rsf-admin/src/page/orders/asnOrder/AsnOrderList.jsx 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/orders/outStock/OutOrderList.jsx 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/AsnOrderLogController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/OutStockController.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/WkOrderController.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/CloudWmsFeedbackResendService.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/CloudWmsFeedbackResendServiceImpl.java 29 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/orders/asnOrder/AsnOrderList.jsx
@@ -51,7 +51,6 @@
import CloseIcon from '@mui/icons-material/Close';
import EditIcon from '@mui/icons-material/Edit';
import TaskIcon from '@mui/icons-material/Task';
import CloudUploadIcon from '@mui/icons-material/CloudUpload';
import { styled } from '@mui/material/styles';
import AsnOrderModal from "./AsnOrderModal";
import request from '@/utils/request';
@@ -182,7 +181,6 @@
            <MyButton setCreateDialog={setCreateDialog} setmodalType={setmodalType} />
            {/* <InspectionButton /> 报检按钮暂不使用 */}
            <CompleteButton />
            <CloudWmsAsnReportButton />
            <ODeleteButton />
            <PrintButton setPrintOrder={setPrintOrder} setSelect={setSelect} />
            {/* <CloseButton /> */}
@@ -214,31 +212,6 @@
  )
}
export default AsnOrderList;
/** manual:放行该单暂缓的云仓上报待办(send_hold);wait_order 一般由调度放行 */
const CloudWmsAsnReportButton = () => {
  const record = useRecordContext();
  const notify = useNotify();
  const refresh = useRefresh();
  const onClick = async (e) => {
    e.stopPropagation();
    try {
      const res = await request.post('/asnOrder/cloudWmsReport/submit', { code: record?.code });
      const { code, msg } = res.data || {};
      if (code === 200) {
        notify(msg || '已提交', { type: 'success' });
        refresh();
      } else {
        notify(msg || '操作失败', { type: 'warning' });
      }
    } catch (err) {
      notify(err?.message || '请求失败', { type: 'warning' });
    }
  };
  return (
    <Button label="云仓上报" size="small" onClick={onClick} startIcon={<CloudUploadIcon />}/>
  );
};
//按PO单新建
const CreateByPoButton = ({ setPoCreate }) => {
rsf-admin/src/page/orders/outStock/OutOrderList.jsx
@@ -59,7 +59,6 @@
import TaskIcon from '@mui/icons-material/Task';
import OutOrderPreview from "./OutOrderPreview";
import AddIcon from '@mui/icons-material/Add';
import CloudUploadIcon from '@mui/icons-material/CloudUpload';
import OutStockPublic from "./OutStockPublic";
import OutOrderModal from "./OutOrderModal";
import request from '@/utils/request';
@@ -329,32 +328,7 @@
      {isInit && <MyButton setCreateDialog={setCreateDialog} setmodalType={setmodalType} />}
      <EditButton label="toolbar.detail" icon={(<DetailsIcon />)} />
      <PublicButton setDrawerVal={setDrawerVal} drawerVal={drawerVal} setSelect={setSelect} />
      <CloudWmsOutReportButton />
    </>
  );
};
const CloudWmsOutReportButton = () => {
  const record = useRecordContext();
  const notify = useNotify();
  const refresh = useRefresh();
  const onClick = async (e) => {
    e.stopPropagation();
    try {
      const res = await request.post('/outStock/cloudWmsReport/submit', { code: record?.code });
      const { code, msg } = res.data || {};
      if (code === 200) {
        notify(msg || '已提交', { type: 'success' });
        refresh();
      } else {
        notify(msg || '操作失败', { type: 'warning' });
      }
    } catch (err) {
      notify(err?.message || '请求失败', { type: 'warning' });
    }
  };
  return (
    <Button label="云仓上报" size="small" onClick={onClick} startIcon={<CloudUploadIcon />} />
  );
};
rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/AsnOrderLogController.java
@@ -36,7 +36,7 @@
    @PreAuthorize("hasAuthority('manager:asnOrderLog:cloudWmsResend')")
    @PostMapping("/asnOrderLog/cloudWms/resendFeedback/{id}")
    public R resendCloudWmsFeedback(@PathVariable Long id) {
        return cloudWmsFeedbackResendService.resendInOutFeedbackByAsnOrderLogId(id);
        return cloudWmsFeedbackResendService.submitInOutCloudWmsByAsnOrderLogId(id);
    }
    @PreAuthorize("hasAuthority('manager:asnOrderLog:list')")
rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/OutStockController.java
@@ -26,7 +26,6 @@
import com.vincent.rsf.server.manager.controller.params.AsnOrderAndItemsParams;
import com.vincent.rsf.server.manager.entity.excel.AsnOrderTemplate;
import com.vincent.rsf.server.manager.enums.AsnExceStatus;
import com.vincent.rsf.server.manager.service.CloudWmsNotifyLogService;
import com.vincent.rsf.server.manager.service.OutStockItemService;
import com.vincent.rsf.server.manager.service.OutStockService;
import com.vincent.rsf.server.system.constant.SerialRuleCode;
@@ -53,16 +52,15 @@
    private OutStockService outStockService;
    @Autowired
    private OutStockItemService outStockItemService;
    @Autowired
    private CloudWmsNotifyLogService cloudWmsNotifyLogService;
    @ApiOperation("手动触发云仓回馈(出库通知单,放行暂缓上报)")
    @PostMapping("/outStock/cloudWmsReport/submit")
    @PreAuthorize("hasAuthority('manager:outStock:list')")
    public R submitCloudWmsReportOutbound(@RequestBody(required = false) Map<String, Object> body) {
        String code = body != null && body.get("code") != null ? String.valueOf(body.get("code")).trim() : null;
        return cloudWmsNotifyLogService.manualFlushToNotifyByOrderCode(code, false);
    }
    // @Autowired
    // private CloudWmsNotifyLogService cloudWmsNotifyLogService;
    // @ApiOperation("手动触发云仓回馈(出库通知单,放行暂缓上报)")
    // @PostMapping("/outStock/cloudWmsReport/submit")
    // @PreAuthorize("hasAuthority('manager:outStock:cloudWmsReport')")
    // public R submitCloudWmsReportOutbound(@RequestBody(required = false) Map<String, Object> body) {
    //     String code = body != null && body.get("code") != null ? String.valueOf(body.get("code")).trim() : null;
    //     return cloudWmsNotifyLogService.manualFlushToNotifyByOrderCode(code, false);
    // }
    @PreAuthorize("hasAuthority('manager:outStock:list')")
    @PostMapping("/outStock/page")
rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/WkOrderController.java
@@ -21,7 +21,6 @@
import com.vincent.rsf.server.manager.entity.excel.AsnOrderTemplate;
import com.vincent.rsf.server.manager.service.AsnOrderItemService;
import com.vincent.rsf.server.manager.service.AsnOrderService;
import com.vincent.rsf.server.manager.service.CloudWmsNotifyLogService;
import com.vincent.rsf.server.manager.service.impl.PurchaseItemServiceImpl;
import com.vincent.rsf.server.manager.service.impl.PurchaseServiceImpl;
import com.vincent.rsf.server.system.constant.SerialRuleCode;
@@ -49,16 +48,15 @@
    private PurchaseServiceImpl purchaseService;
    @Autowired
    private PurchaseItemServiceImpl purchaseItemService;
    @Autowired
    private CloudWmsNotifyLogService cloudWmsNotifyLogService;
    @ApiOperation("手动触发云仓回馈(入库通知单,放行暂缓上报)")
    @PostMapping("/asnOrder/cloudWmsReport/submit")
    @PreAuthorize("hasAuthority('manager:asnOrder:list')")
    public R submitCloudWmsReportInbound(@RequestBody(required = false) Map<String, Object> body) {
        String code = body != null && body.get("code") != null ? String.valueOf(body.get("code")).trim() : null;
        return cloudWmsNotifyLogService.manualFlushToNotifyByOrderCode(code, true);
    }
    // @Autowired
    // private CloudWmsNotifyLogService cloudWmsNotifyLogService;
    // @ApiOperation("手动触发云仓回馈(入库通知单,放行暂缓上报)")
    // @PostMapping("/asnOrder/cloudWmsReport/submit")
    // @PreAuthorize("hasAuthority('manager:asnOrder:cloudWmsReport')")
    // public R submitCloudWmsReportInbound(@RequestBody(required = false) Map<String, Object> body) {
    //     String code = body != null && body.get("code") != null ? String.valueOf(body.get("code")).trim() : null;
    //     return cloudWmsNotifyLogService.manualFlushToNotifyByOrderCode(code, true);
    // }
    @PreAuthorize("hasAuthority('manager:asnOrder:list')")
    @PostMapping("/asnOrder/page")
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/CloudWmsFeedbackResendService.java
@@ -2,11 +2,11 @@
import com.vincent.rsf.framework.common.R;
/** 按出入库历史单重发云仓入出库反馈(写入或刷新上报待办队列) */
/** 出入库历史单:云仓入出库上报(先尝试放行暂缓待办,否则按历史上报记录入队) */
public interface CloudWmsFeedbackResendService {
    /**
     * @param asnOrderLogId man_asn_order_log / AsnOrderLog 主键
     */
    R resendInOutFeedbackByAsnOrderLogId(Long asnOrderLogId);
    R submitInOutCloudWmsByAsnOrderLogId(Long asnOrderLogId);
}
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/CloudWmsFeedbackResendServiceImpl.java
@@ -9,6 +9,7 @@
import com.vincent.rsf.server.api.controller.erp.params.InOutResultReportParam;
import com.vincent.rsf.server.manager.entity.AsnOrderLog;
import com.vincent.rsf.server.manager.entity.CloudWmsNotifyLog;
import com.vincent.rsf.server.manager.enums.OrderType;
import com.vincent.rsf.server.manager.service.AsnOrderLogService;
import com.vincent.rsf.server.manager.service.CloudWmsFeedbackResendService;
import com.vincent.rsf.server.manager.service.CloudWmsNotifyLogService;
@@ -20,8 +21,7 @@
import java.util.*;
/**
 * 从历史云仓上报记录中取「最新一条」按明细维度去重后,复制请求体写入待发送队列;
 * 若已存在相同请求体且仍为待发送/失败,则更新为可调度状态,不重复插入。
 * 历史单触发云仓入出库上报:优先放行该单暂缓待办;若无则从历史云仓上报记录复制请求体入队。
 */
@Slf4j
@Service
@@ -37,7 +37,7 @@
    private ObjectMapper objectMapper;
    @Override
    public R resendInOutFeedbackByAsnOrderLogId(Long asnOrderLogId) {
    public R submitInOutCloudWmsByAsnOrderLogId(Long asnOrderLogId) {
        if (asnOrderLogId == null) {
            return R.error("参数不能为空");
        }
@@ -47,8 +47,18 @@
        }
        String code = orderLog.getCode();
        if (StringUtils.isBlank(code)) {
            return R.error("单据号为空,无法重发");
            return R.error("单据号为空");
        }
        boolean inbound = inboundFromOrderType(orderLog.getType());
        R flushR = cloudWmsNotifyLogService.manualFlushToNotifyByOrderCode(code.trim(), inbound);
        Object flushCode = flushR.get("code");
        if (flushCode instanceof Number && ((Number) flushCode).intValue() == 200) {
            return flushR;
        }
        return enqueueFromHistoricalNotifyLogs(asnOrderLogId, orderLog, code);
    }
    private R enqueueFromHistoricalNotifyLogs(Long asnOrderLogId, AsnOrderLog orderLog, String code) {
        String reportType = cloudWmsNotifyLogService.getReportTypeInOutResult();
        LambdaQueryWrapper<CloudWmsNotifyLog> qw = new LambdaQueryWrapper<CloudWmsNotifyLog>()
                .eq(CloudWmsNotifyLog::getReportType, reportType)
@@ -91,7 +101,7 @@
            }
        }
        if (latestByLine.isEmpty()) {
            return R.error("未找到该单号对应的云仓入出库上报记录,无法重发");
            return R.error("未找到该单号对应的云仓入出库上报记录");
        }
        Date now = new Date();
        int n = 0;
@@ -117,7 +127,14 @@
                n++;
            }
        }
        return R.ok("已加入云仓重发队列 " + n + " 条,将由定时任务发送").add(n);
        return R.ok("已加入云仓上报队列 " + n + " 条,将由定时任务发送").add(n);
    }
    private static boolean inboundFromOrderType(String type) {
        if (StringUtils.isBlank(type)) {
            return true;
        }
        return OrderType.ORDER_IN.type.equalsIgnoreCase(type.trim());
    }
    /**