8 changed files with 835 additions and 1 deletions
-
117src/main/java/com/gaotao/modules/shopOrder/controller/WorkOrderDetailsAllocController.java
-
56src/main/java/com/gaotao/modules/shopOrder/dao/WorkOrderDetailsAllocMapper.java
-
90src/main/java/com/gaotao/modules/shopOrder/entity/SearchWorkOrderDetailsAlloc.java
-
317src/main/java/com/gaotao/modules/shopOrder/service/Impl/WorkOrderDetailsAllocServiceImpl.java
-
35src/main/java/com/gaotao/modules/shopOrder/service/WorkOrderDetailsAllocService.java
-
2src/main/resources/mapper/boxManage/BoxForNotificationMapper.xml
-
1src/main/resources/mapper/inboundNotification/InboundNotificationHeadMapper.xml
-
218src/main/resources/mapper/shopOrder/WorkOrderDetailsAllocMapper.xml
@ -0,0 +1,117 @@ |
|||
package com.gaotao.modules.shopOrder.controller; |
|||
|
|||
import com.gaotao.common.utils.PageUtils; |
|||
import com.gaotao.common.utils.R; |
|||
import com.gaotao.modules.pda.utils.ResponseData; |
|||
import com.gaotao.modules.shopOrder.entity.SearchWorkOrderDetailsAlloc; |
|||
import com.gaotao.modules.shopOrder.entity.UspWorkOrderAllocData; |
|||
import com.gaotao.modules.shopOrder.service.WorkOrderDetailsAllocService; |
|||
import com.gaotao.modules.sys.controller.AbstractController; |
|||
import org.springframework.beans.factory.annotation.Autowired; |
|||
import org.springframework.web.bind.annotation.*; |
|||
|
|||
import java.util.ArrayList; |
|||
import java.util.List; |
|||
|
|||
/** |
|||
* 工单明细数据汇总控制器 |
|||
*/ |
|||
@RestController |
|||
@RequestMapping("/shopOrder/workOrderDetailsAlloc") |
|||
public class WorkOrderDetailsAllocController extends AbstractController { |
|||
|
|||
@Autowired |
|||
private WorkOrderDetailsAllocService workOrderDetailsAllocService; |
|||
|
|||
/** |
|||
* 分页查询工单明细汇总主信息 |
|||
*/ |
|||
@PostMapping("/searchWorkOrderDetails") |
|||
public R searchWorkOrderDetails(@RequestBody SearchWorkOrderDetailsAlloc query) { |
|||
if (query.getUser() == null || query.getUser().isEmpty()) { |
|||
query.setUser(getUser().getUsername()); |
|||
} |
|||
PageUtils page = workOrderDetailsAllocService.searchWorkOrderDetailsForAlloc(query); |
|||
return R.ok().put("page", page); |
|||
} |
|||
|
|||
/** |
|||
* 查询工单汇总数据(根据allocType) |
|||
*/ |
|||
@PostMapping("/list") |
|||
public R list(@RequestBody UspWorkOrderAllocData params) { |
|||
List<UspWorkOrderAllocData> list = workOrderDetailsAllocService.selectByAllocType(params); |
|||
|
|||
// 手动分页处理 |
|||
int totalCount = list.size(); |
|||
int pageSize = params.getLimit() > 0 ? params.getLimit() : 20; |
|||
int offset = params.getPage(); |
|||
int currPage = offset / pageSize + 1; |
|||
|
|||
int fromIndex = offset; |
|||
int toIndex = Math.min(fromIndex + pageSize, totalCount); |
|||
|
|||
List<UspWorkOrderAllocData> pageList; |
|||
if (fromIndex < totalCount) { |
|||
pageList = list.subList(fromIndex, toIndex); |
|||
} else { |
|||
pageList = new ArrayList<>(); |
|||
} |
|||
|
|||
PageUtils page = new PageUtils(pageList, totalCount, pageSize, currPage); |
|||
return R.ok().put("page", page); |
|||
} |
|||
|
|||
/** |
|||
* 执行工单明细数据汇总(调用存储过程) |
|||
*/ |
|||
@PostMapping("/executeAlloc") |
|||
public R executeAlloc(@RequestBody SearchWorkOrderDetailsAlloc query) { |
|||
if (query.getUser() == null || query.getUser().isEmpty()) { |
|||
query.setUser(getUser().getUsername()); |
|||
} |
|||
|
|||
ResponseData response = workOrderDetailsAllocService.executeWorkOrderDetailsAlloc(query); |
|||
if (response.isSuccess()) { |
|||
return R.ok(response.getMsg()); |
|||
} else { |
|||
return R.error(response.getMsg()); |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* 执行工单数据回传(调用U8接口) |
|||
*/ |
|||
@PostMapping("/executeSync") |
|||
public R executeSync(@RequestBody WorkOrderSyncRequest request) { |
|||
ResponseData response = workOrderDetailsAllocService.executeWorkOrderSync( |
|||
request.getSite(), |
|||
request.getUserName(), |
|||
request.getOrderList() |
|||
); |
|||
if (response.isSuccess()) { |
|||
return R.ok(response.getMsg()); |
|||
} else { |
|||
return R.error(response.getMsg()); |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* 工单数据回传请求DTO |
|||
*/ |
|||
@lombok.Data |
|||
public static class WorkOrderSyncRequest { |
|||
private String site; |
|||
private String userName; |
|||
private List<OrderSiteItem> orderList; |
|||
} |
|||
|
|||
/** |
|||
* 工单和Site信息 |
|||
*/ |
|||
@lombok.Data |
|||
public static class OrderSiteItem { |
|||
private String orderNo; |
|||
private String site; |
|||
} |
|||
} |
|||
@ -0,0 +1,56 @@ |
|||
package com.gaotao.modules.shopOrder.dao; |
|||
|
|||
import com.gaotao.modules.shopOrder.entity.SearchWorkOrderDetailsAlloc; |
|||
import com.gaotao.modules.shopOrder.entity.UspWorkOrderAllocData; |
|||
import org.apache.ibatis.annotations.Mapper; |
|||
import org.apache.ibatis.annotations.Param; |
|||
import org.springframework.stereotype.Repository; |
|||
|
|||
import java.util.Date; |
|||
import java.util.List; |
|||
|
|||
/** |
|||
* 工单明细数据汇总Mapper |
|||
*/ |
|||
@Mapper |
|||
@Repository |
|||
public interface WorkOrderDetailsAllocMapper { |
|||
|
|||
/** |
|||
* 分页查询工单明细汇总主信息 |
|||
*/ |
|||
List<SearchWorkOrderDetailsAlloc> searchWorkOrderDetailsForAlloc(@Param("query") SearchWorkOrderDetailsAlloc query); |
|||
|
|||
/** |
|||
* 根据allocType查询工单汇总数据 |
|||
*/ |
|||
List<UspWorkOrderAllocData> selectByAllocType(UspWorkOrderAllocData data); |
|||
|
|||
/** |
|||
* 查询未传输的数据(产量未传输或工时未传输) |
|||
*/ |
|||
List<UspWorkOrderAllocData> selectUnSyncedData(UspWorkOrderAllocData data); |
|||
|
|||
/** |
|||
* 更新SFDC表的synced_code和synced_flag |
|||
*/ |
|||
void updateSfdcSyncedCode(@Param("site") String site, |
|||
@Param("orderNo") String orderNo, |
|||
@Param("batchNo") String batchNo, |
|||
@Param("syncedCode") String syncedCode); |
|||
|
|||
/** |
|||
* 更新UspWorkOrderAlloc的同步异常信息 |
|||
*/ |
|||
void updateAllocSyncedError(@Param("site") String site, |
|||
@Param("orderNo") String orderNo, |
|||
@Param("rowNo") String rowNo, |
|||
@Param("syncedDate") Date syncedDate, |
|||
@Param("syncedMes") String syncedMes); |
|||
|
|||
/** |
|||
* 更新UspWorkOrderAlloc的同步成功信息 |
|||
*/ |
|||
void updateAllocSyncedSuccess(@Param("site") String site, |
|||
@Param("orderNo") String orderNo); |
|||
} |
|||
@ -0,0 +1,90 @@ |
|||
package com.gaotao.modules.shopOrder.entity; |
|||
|
|||
import com.fasterxml.jackson.annotation.JsonFormat; |
|||
import com.gaotao.common.utils.QueryPage; |
|||
import lombok.Data; |
|||
import lombok.EqualsAndHashCode; |
|||
import org.springframework.format.annotation.DateTimeFormat; |
|||
|
|||
import java.math.BigDecimal; |
|||
import java.util.Date; |
|||
|
|||
/** |
|||
* 工单明细数据汇总查询与列表实体 |
|||
*/ |
|||
@Data |
|||
@EqualsAndHashCode(callSuper=false) |
|||
public class SearchWorkOrderDetailsAlloc extends QueryPage { |
|||
|
|||
private String site; |
|||
private String orderNo; |
|||
private String orderType; |
|||
private String seqNo; |
|||
private String partNo; |
|||
private String partDescription; |
|||
private String batchNo; |
|||
private String userName; |
|||
private String workCenterNo; |
|||
private String user; |
|||
|
|||
@DateTimeFormat(pattern = "yyyy-MM-dd") |
|||
@JsonFormat(pattern = "yyyy-MM-dd") |
|||
private Date date1; |
|||
|
|||
@DateTimeFormat(pattern = "yyyy-MM-dd") |
|||
@JsonFormat(pattern = "yyyy-MM-dd") |
|||
private Date date2; |
|||
|
|||
@DateTimeFormat(pattern = "yyyy-MM-dd") |
|||
@JsonFormat(pattern = "yyyy-MM-dd") |
|||
private Date date3; |
|||
|
|||
@DateTimeFormat(pattern = "yyyy-MM-dd") |
|||
@JsonFormat(pattern = "yyyy-MM-dd") |
|||
private Date date4; |
|||
|
|||
@DateTimeFormat(pattern = "yyyy-MM-dd") |
|||
@JsonFormat(pattern = "yyyy-MM-dd") |
|||
private Date finishDate1; |
|||
|
|||
@DateTimeFormat(pattern = "yyyy-MM-dd") |
|||
@JsonFormat(pattern = "yyyy-MM-dd") |
|||
private Date finishDate2; |
|||
|
|||
@DateTimeFormat(pattern = "yyyy-MM-dd") |
|||
@JsonFormat(pattern = "yyyy-MM-dd") |
|||
private Date reportDate1; |
|||
|
|||
@DateTimeFormat(pattern = "yyyy-MM-dd") |
|||
@JsonFormat(pattern = "yyyy-MM-dd") |
|||
private Date reportDate2; |
|||
|
|||
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") |
|||
private Date createDate; |
|||
|
|||
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") |
|||
private Date planFinishTime; |
|||
|
|||
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") |
|||
private Date finishTime; |
|||
|
|||
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") |
|||
private Date sScheduledDate; |
|||
|
|||
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") |
|||
private Date closedDate; |
|||
|
|||
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") |
|||
private Date reportDate; |
|||
|
|||
private String scheduledShiftNo; |
|||
private String operatorId; |
|||
|
|||
private BigDecimal lotSize; |
|||
private BigDecimal totalReportQty; |
|||
private BigDecimal totalApproveQty; |
|||
private BigDecimal defectQty; |
|||
private BigDecimal totalSetupTime; |
|||
private BigDecimal totalManfTime; |
|||
private BigDecimal totalDownTime; |
|||
} |
|||
@ -0,0 +1,317 @@ |
|||
package com.gaotao.modules.shopOrder.service.Impl; |
|||
|
|||
import com.alibaba.fastjson.JSON; |
|||
import com.gaotao.common.utils.PageUtils; |
|||
import com.gaotao.modules.pda.utils.ResponseData; |
|||
import com.gaotao.modules.pms.util.HttpClientUtil; |
|||
import com.gaotao.modules.report.dao.ProcedureDao; |
|||
import com.gaotao.modules.shopOrder.controller.WorkOrderDetailsAllocController.OrderSiteItem; |
|||
import com.gaotao.modules.shopOrder.dao.WorkOrderDetailsAllocMapper; |
|||
import com.gaotao.modules.shopOrder.entity.SearchWorkOrderDetailsAlloc; |
|||
import com.gaotao.modules.shopOrder.entity.UspWorkOrderAllocData; |
|||
import com.gaotao.modules.shopOrder.entity.dto.U8WorkHourRequestDto; |
|||
import com.gaotao.modules.shopOrder.entity.dto.U8WorkHourResponseDto; |
|||
import com.gaotao.modules.shopOrder.service.WorkOrderDetailsAllocService; |
|||
import lombok.extern.slf4j.Slf4j; |
|||
import org.springframework.beans.factory.annotation.Autowired; |
|||
import org.springframework.beans.factory.annotation.Value; |
|||
import org.springframework.stereotype.Service; |
|||
import org.springframework.transaction.annotation.Transactional; |
|||
|
|||
import java.math.BigDecimal; |
|||
import java.text.SimpleDateFormat; |
|||
import java.util.ArrayList; |
|||
import java.util.Date; |
|||
import java.util.List; |
|||
import java.util.Map; |
|||
import java.util.stream.Collectors; |
|||
|
|||
/** |
|||
* 工单明细数据汇总服务实现类 |
|||
*/ |
|||
@Slf4j |
|||
@Service |
|||
public class WorkOrderDetailsAllocServiceImpl implements WorkOrderDetailsAllocService { |
|||
|
|||
@Autowired |
|||
private WorkOrderDetailsAllocMapper workOrderDetailsAllocMapper; |
|||
|
|||
@Autowired |
|||
private ProcedureDao procedureDao; |
|||
|
|||
/** |
|||
* U8接口地址,从配置文件读取 |
|||
*/ |
|||
@Value("${u8.workhour.add.url:}") |
|||
private String u8WorkHourAddUrl; |
|||
|
|||
@Override |
|||
public PageUtils searchWorkOrderDetailsForAlloc(SearchWorkOrderDetailsAlloc query) { |
|||
int pageSize = query.getLimit() > 0 ? query.getLimit() : 20; |
|||
int offset = query.getPage(); |
|||
int currPage = offset / pageSize + 1; |
|||
|
|||
List<SearchWorkOrderDetailsAlloc> list = workOrderDetailsAllocMapper.searchWorkOrderDetailsForAlloc(query); |
|||
|
|||
int total = list.size(); |
|||
int fromIndex = offset; |
|||
int toIndex = Math.min(fromIndex + pageSize, total); |
|||
|
|||
List<SearchWorkOrderDetailsAlloc> pageList; |
|||
if (fromIndex < total) { |
|||
pageList = list.subList(fromIndex, toIndex); |
|||
} else { |
|||
pageList = new ArrayList<>(); |
|||
} |
|||
|
|||
return new PageUtils(pageList, total, pageSize, currPage); |
|||
} |
|||
|
|||
@Override |
|||
public List<UspWorkOrderAllocData> selectByAllocType(UspWorkOrderAllocData data) { |
|||
return workOrderDetailsAllocMapper.selectByAllocType(data); |
|||
} |
|||
|
|||
@Override |
|||
@Transactional(rollbackFor = Exception.class) |
|||
public ResponseData executeWorkOrderDetailsAlloc(SearchWorkOrderDetailsAlloc query) { |
|||
ResponseData responseData = new ResponseData(); |
|||
try { |
|||
log.info("开始执行工单明细数据汇总"); |
|||
|
|||
List<Object> params = new ArrayList<>(); |
|||
params.add(defaultString(query.getSite())); |
|||
params.add(defaultString(query.getOrderNo())); |
|||
params.add(defaultString(query.getSeqNo())); |
|||
params.add(formatDateParam(query.getDate1())); |
|||
params.add(formatDateParam(query.getDate2())); |
|||
params.add(formatDateParam(query.getDate3())); |
|||
params.add(formatDateParam(query.getDate4())); |
|||
params.add(formatDateParam(query.getFinishDate1())); |
|||
params.add(formatDateParam(query.getFinishDate2())); |
|||
params.add(formatDateParam(query.getReportDate1())); |
|||
params.add(formatDateParam(query.getReportDate2())); |
|||
params.add(defaultString(query.getUserName())); |
|||
params.add(defaultString(query.getWorkCenterNo())); |
|||
|
|||
List<Map<String, Object>> resultList = procedureDao.getProcedureData("UspInsertWorkOrderDetailsAlloc", params); |
|||
|
|||
String resultMsg = "工单明细数据汇总完成"; |
|||
if (resultList != null && !resultList.isEmpty()) { |
|||
String code = String.valueOf(resultList.get(0).get("resultCode")); |
|||
if ("400".equalsIgnoreCase(code)) { |
|||
String msg = String.valueOf(resultList.get(0).get("resultMsg")); |
|||
responseData.setCode("500"); |
|||
responseData.setSuccess(false); |
|||
responseData.setMsg("工单明细数据汇总失败: " + msg); |
|||
return responseData; |
|||
} |
|||
if (resultList.get(0).get("resultMsg") != null) { |
|||
resultMsg = String.valueOf(resultList.get(0).get("resultMsg")); |
|||
} |
|||
} |
|||
|
|||
responseData.setCode("200"); |
|||
responseData.setSuccess(true); |
|||
responseData.setMsg(resultMsg); |
|||
log.info("工单明细数据汇总成功:{}", resultMsg); |
|||
} catch (Exception e) { |
|||
log.error("执行工单明细数据汇总时发生异常", e); |
|||
responseData.setCode("500"); |
|||
responseData.setSuccess(false); |
|||
responseData.setMsg("执行工单明细数据汇总时发生异常: " + e.getMessage()); |
|||
} |
|||
return responseData; |
|||
} |
|||
|
|||
@Override |
|||
@Transactional(rollbackFor = Exception.class) |
|||
public ResponseData executeWorkOrderSync(String site, String userName, List<OrderSiteItem> orderList) { |
|||
ResponseData responseData = new ResponseData(); |
|||
try { |
|||
log.info("开始执行工单数据回传"); |
|||
|
|||
// 1. 查询未传输的数据 |
|||
List<UspWorkOrderAllocData> unSyncedList = new ArrayList<>(); |
|||
if (orderList != null && !orderList.isEmpty()) { |
|||
// 有选中行时,按每行的site和orderNo查询 |
|||
for (OrderSiteItem item : orderList) { |
|||
UspWorkOrderAllocData queryData = new UspWorkOrderAllocData(); |
|||
queryData.setSite(item.getSite()); |
|||
queryData.setOrderNo(item.getOrderNo()); |
|||
List<UspWorkOrderAllocData> itemList = workOrderDetailsAllocMapper.selectUnSyncedData(queryData); |
|||
if (itemList != null) { |
|||
unSyncedList.addAll(itemList); |
|||
} |
|||
} |
|||
} else { |
|||
// 没有选中行时,使用当前用户可见工厂查询 |
|||
UspWorkOrderAllocData queryData = new UspWorkOrderAllocData(); |
|||
queryData.setCurrentUser(userName); |
|||
unSyncedList = workOrderDetailsAllocMapper.selectUnSyncedData(queryData); |
|||
} |
|||
|
|||
if (unSyncedList == null || unSyncedList.isEmpty()) { |
|||
responseData.setCode("200"); |
|||
responseData.setSuccess(true); |
|||
responseData.setMsg("没有需要回传的数据"); |
|||
return responseData; |
|||
} |
|||
|
|||
log.info("查询到{}条待回传数据", unSyncedList.size()); |
|||
|
|||
int successCount = 0; |
|||
int failCount = 0; |
|||
StringBuilder errorMessages = new StringBuilder(); |
|||
|
|||
// 2. 按照erp_orderNo和erp_orderLineNo分组 |
|||
Map<String, List<UspWorkOrderAllocData>> groupedData = unSyncedList.stream() |
|||
.collect(Collectors.groupingBy(item -> |
|||
item.getErpOrderNo() + "_" + item.getErpOrderLineNo() + "_" + |
|||
(item.getAllocDate() != null ? item.getAllocDate() : ""))); |
|||
|
|||
// 3. 逐组调用U8接口 |
|||
for (Map.Entry<String, List<UspWorkOrderAllocData>> entry : groupedData.entrySet()) { |
|||
List<UspWorkOrderAllocData> groupItems = entry.getValue(); |
|||
if (groupItems.isEmpty()) { |
|||
continue; |
|||
} |
|||
|
|||
UspWorkOrderAllocData firstItem = groupItems.get(0); |
|||
|
|||
try { |
|||
// 构建U8请求参数 |
|||
U8WorkHourRequestDto requestDto = new U8WorkHourRequestDto(); |
|||
requestDto.setMocode(firstItem.getErpOrderNo() != null ? firstItem.getErpOrderNo() : ""); |
|||
requestDto.setIrowNo(firstItem.getErpOrderLineNo() != null ? firstItem.getErpOrderLineNo() : ""); |
|||
if (firstItem.getAllocDate() != null) { |
|||
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); |
|||
requestDto.setDDate(sdf.format(firstItem.getAllocDate())); |
|||
} else { |
|||
requestDto.setDDate(""); |
|||
} |
|||
|
|||
List<U8WorkHourRequestDto.DetailItem> detailList = new ArrayList<>(); |
|||
for (UspWorkOrderAllocData item : groupItems) { |
|||
U8WorkHourRequestDto.DetailItem detailItem = new U8WorkHourRequestDto.DetailItem(); |
|||
detailItem.setMesIrowNo(item.getRowNo() != null ? item.getRowNo() : ""); |
|||
detailItem.setSortSeq(item.getItemNo() != null ? item.getItemNo() : ""); |
|||
detailItem.setEqId(""); |
|||
detailItem.setDutyClassCode(""); |
|||
detailItem.setEmployCode(item.getOperator() != null ? item.getOperator() : ""); |
|||
detailItem.setQualifiedQty(item.getAllocApproveQty() != null ? String.valueOf(item.getAllocApproveQty()) : ""); |
|||
detailItem.setRefusedQty(""); |
|||
detailItem.setScrapQty(item.getAllocScrapQty() != null ? String.valueOf(item.getAllocScrapQty()) : ""); |
|||
|
|||
// 计算工时:调机时长 + 制造时长 |
|||
BigDecimal workHr = BigDecimal.ZERO; |
|||
if (item.getAllocSetupTime() != null) { |
|||
workHr = workHr.add(item.getAllocSetupTime()); |
|||
} |
|||
if (item.getAllocManfTime() != null) { |
|||
workHr = workHr.add(item.getAllocManfTime()); |
|||
} |
|||
detailItem.setWorkHr(workHr.compareTo(BigDecimal.ZERO) == 0 ? "0" : workHr.toString()); |
|||
|
|||
detailList.add(detailItem); |
|||
} |
|||
requestDto.setDetailList(detailList); |
|||
|
|||
// 调用U8接口 |
|||
log.info("调用U8接口,请求参数: {}", JSON.toJSONString(requestDto)); |
|||
com.gaotao.modules.pms.util.ResponseData httpResponse = |
|||
HttpClientUtil.doPostByRaw(u8WorkHourAddUrl, requestDto); |
|||
|
|||
if (httpResponse.isSuccess()) { |
|||
// 解析响应 |
|||
U8WorkHourResponseDto u8Response = JSON.parseObject(httpResponse.getMsg(), U8WorkHourResponseDto.class); |
|||
|
|||
if ("success".equalsIgnoreCase(u8Response.getFlag())) { |
|||
// 接口调用成功,更新UspWorkOrderAlloc同步成功信息 |
|||
for (UspWorkOrderAllocData item : groupItems) { |
|||
workOrderDetailsAllocMapper.updateAllocSyncedSuccess( |
|||
item.getSite(), |
|||
item.getOrderNo()); |
|||
} |
|||
successCount += groupItems.size(); |
|||
log.info("U8接口调用成功,返回单号: {}", u8Response.getU8CCode()); |
|||
} else { |
|||
// 接口返回错误 |
|||
String errMsg = u8Response.getErrMsg(); |
|||
for (UspWorkOrderAllocData item : groupItems) { |
|||
workOrderDetailsAllocMapper.updateAllocSyncedError( |
|||
item.getSite(), |
|||
item.getOrderNo(), |
|||
item.getRowNo(), |
|||
new Date(), |
|||
errMsg); |
|||
} |
|||
failCount += groupItems.size(); |
|||
errorMessages.append("订单").append(firstItem.getErpOrderNo()) |
|||
.append("回传失败: ").append(errMsg).append("; "); |
|||
log.error("U8接口返回错误: {}", errMsg); |
|||
} |
|||
} else { |
|||
// HTTP请求失败 |
|||
String errMsg = "HTTP请求失败: " + httpResponse.getMsg(); |
|||
for (UspWorkOrderAllocData item : groupItems) { |
|||
workOrderDetailsAllocMapper.updateAllocSyncedError( |
|||
item.getSite(), |
|||
item.getOrderNo(), |
|||
item.getRowNo(), |
|||
new Date(), |
|||
errMsg); |
|||
} |
|||
failCount += groupItems.size(); |
|||
errorMessages.append("订单").append(firstItem.getErpOrderNo()) |
|||
.append("回传失败: ").append(errMsg).append("; "); |
|||
log.error("调用U8接口HTTP请求失败: {}", httpResponse.getMsg()); |
|||
} |
|||
} catch (Exception e) { |
|||
// 异常处理 |
|||
String errMsg = "处理异常: " + e.getMessage(); |
|||
for (UspWorkOrderAllocData item : groupItems) { |
|||
workOrderDetailsAllocMapper.updateAllocSyncedError( |
|||
item.getSite(), |
|||
item.getOrderNo(), |
|||
item.getRowNo(), |
|||
new Date(), |
|||
errMsg); |
|||
} |
|||
failCount += groupItems.size(); |
|||
errorMessages.append("订单").append(firstItem.getErpOrderNo()) |
|||
.append("回传异常: ").append(e.getMessage()).append("; "); |
|||
log.error("工单数据回传处理异常,订单号: {}", firstItem.getErpOrderNo(), e); |
|||
} |
|||
} |
|||
|
|||
// 返回结果 |
|||
String resultMsg = String.format("工单数据回传完成,成功%d条,失败%d条", successCount, failCount); |
|||
if (failCount > 0) { |
|||
resultMsg += "。失败详情: " + errorMessages; |
|||
} |
|||
|
|||
responseData.setCode(failCount > 0 ? "500" : "200"); |
|||
responseData.setSuccess(failCount == 0); |
|||
responseData.setMsg(resultMsg); |
|||
|
|||
} catch (Exception e) { |
|||
log.error("执行工单数据回传时发生异常", e); |
|||
responseData.setCode("500"); |
|||
responseData.setSuccess(false); |
|||
responseData.setMsg("执行工单数据回传时发生异常: " + e.getMessage()); |
|||
} |
|||
return responseData; |
|||
} |
|||
|
|||
private String formatDateParam(Date date) { |
|||
if (date == null) { |
|||
return ""; |
|||
} |
|||
return new SimpleDateFormat("yyyy-MM-dd").format(date); |
|||
} |
|||
|
|||
private String defaultString(String value) { |
|||
return value == null ? "" : value; |
|||
} |
|||
} |
|||
@ -0,0 +1,35 @@ |
|||
package com.gaotao.modules.shopOrder.service; |
|||
|
|||
import com.gaotao.common.utils.PageUtils; |
|||
import com.gaotao.modules.pda.utils.ResponseData; |
|||
import com.gaotao.modules.shopOrder.controller.WorkOrderDetailsAllocController.OrderSiteItem; |
|||
import com.gaotao.modules.shopOrder.entity.SearchWorkOrderDetailsAlloc; |
|||
import com.gaotao.modules.shopOrder.entity.UspWorkOrderAllocData; |
|||
|
|||
import java.util.List; |
|||
|
|||
/** |
|||
* 工单明细数据汇总服务接口 |
|||
*/ |
|||
public interface WorkOrderDetailsAllocService { |
|||
|
|||
/** |
|||
* 分页查询工单明细汇总主信息 |
|||
*/ |
|||
PageUtils searchWorkOrderDetailsForAlloc(SearchWorkOrderDetailsAlloc query); |
|||
|
|||
/** |
|||
* 根据allocType查询工单汇总数据 |
|||
*/ |
|||
List<UspWorkOrderAllocData> selectByAllocType(UspWorkOrderAllocData data); |
|||
|
|||
/** |
|||
* 执行工单明细数据汇总(调用存储过程) |
|||
*/ |
|||
ResponseData executeWorkOrderDetailsAlloc(SearchWorkOrderDetailsAlloc query); |
|||
|
|||
/** |
|||
* 执行工单数据回传(调用U8接口) |
|||
*/ |
|||
ResponseData executeWorkOrderSync(String site, String userName, List<OrderSiteItem> orderList); |
|||
} |
|||
@ -0,0 +1,218 @@ |
|||
<?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.gaotao.modules.shopOrder.dao.WorkOrderDetailsAllocMapper"> |
|||
|
|||
<sql id="workOrderDetailsBaseConditions"> |
|||
and A.site in (Select Site from AccessSite where upper(UserID)=#{query.user}) |
|||
<if test="query.site != null and query.site != ''"> |
|||
AND A.Site like '%' + #{query.site} + '%' |
|||
</if> |
|||
<if test="query.orderNo != null and query.orderNo != ''"> |
|||
AND A.OrderNo like '%' + #{query.orderNo} + '%' |
|||
</if> |
|||
<if test="query.orderType != null and query.orderType != ''"> |
|||
AND A.OrderType like '%' + #{query.orderType} + '%' |
|||
</if> |
|||
<if test="query.seqNo != null and query.seqNo != ''"> |
|||
AND B.SeqNo like '%' + #{query.seqNo} + '%' |
|||
</if> |
|||
<if test="query.partNo != null and query.partNo != ''"> |
|||
AND A.PartNo like '%' + #{query.partNo} + '%' |
|||
</if> |
|||
<if test="query.partDescription != null and query.partDescription != ''"> |
|||
AND P.PartDescription like '%' + #{query.partDescription} + '%' |
|||
</if> |
|||
<if test="query.userName != null and query.userName != ''"> |
|||
AND C.OperatorID like '%' + #{query.userName} + '%' |
|||
</if> |
|||
<if test="query.workCenterNo != null and query.workCenterNo != ''"> |
|||
AND C.WorkCenterNo like '%' + #{query.workCenterNo} + '%' |
|||
</if> |
|||
<if test="query.date1 != null"> |
|||
AND A.create_date >= #{query.date1} |
|||
</if> |
|||
<if test="query.date2 != null"> |
|||
AND dateadd(DAY, 1, #{query.date2}) > A.create_date |
|||
</if> |
|||
<if test="query.date3 != null"> |
|||
AND B.PlanFinishTime >= #{query.date3} |
|||
</if> |
|||
<if test="query.date4 != null"> |
|||
AND dateadd(DAY, 1, #{query.date4}) > B.PlanFinishTime |
|||
</if> |
|||
<if test="query.finishDate1 != null"> |
|||
AND B.finishtime >= #{query.finishDate1} |
|||
</if> |
|||
<if test="query.finishDate2 != null"> |
|||
AND dateadd(DAY, 1, #{query.finishDate2}) > B.finishtime |
|||
</if> |
|||
<if test="query.reportDate1 != null"> |
|||
AND C.ReportDate >= #{query.reportDate1} |
|||
</if> |
|||
<if test="query.reportDate2 != null"> |
|||
AND dateadd(DAY, 1, #{query.reportDate2}) > C.ReportDate |
|||
</if> |
|||
</sql> |
|||
|
|||
<!-- 分页查询工单明细汇总主信息 --> |
|||
<select id="searchWorkOrderDetailsForAlloc" |
|||
parameterType="com.gaotao.modules.shopOrder.entity.SearchWorkOrderDetailsAlloc" |
|||
resultType="com.gaotao.modules.shopOrder.entity.SearchWorkOrderDetailsAlloc"> |
|||
SELECT |
|||
A.Site AS site, |
|||
A.OrderNo AS orderNo, |
|||
A.OrderType AS orderType, |
|||
B.SeqNo AS seqNo, |
|||
A.PartNo AS partNo, |
|||
P.PartDescription AS partDescription, |
|||
A.LotSize AS lotSize, |
|||
A.batch_no AS batchNo, |
|||
A.create_date AS createDate, |
|||
B.PlanFinishTime AS planFinishTime, |
|||
B.finishtime AS finishTime, |
|||
B.S_ScheduledDate AS sScheduledDate, |
|||
B.ClosedDate AS closedDate, |
|||
C.OperatorID AS operatorId, |
|||
C.ReportDate AS reportDate, |
|||
C.Scheduled_ShiftNo AS scheduledShiftNo, |
|||
C.WorkCenterNo AS workCenterNo, |
|||
SUM(ISNULL(C.ReportQty, 0)) AS totalReportQty, |
|||
SUM(ISNULL(C.ApproveQty, 0)) AS totalApproveQty, |
|||
SUM(ISNULL(C.ReportQty, 0) - ISNULL(C.ApproveQty, 0)) AS defectQty, |
|||
SUM(ISNULL(C.ReportedSetupTime, 0)) AS totalSetupTime, |
|||
SUM(ISNULL(C.ReportedManfTime, 0)) AS totalManfTime, |
|||
SUM(ISNULL(C.downtime, 0)) AS totalDownTime |
|||
FROM ShopOrder A |
|||
INNER JOIN SOScheduledRouting B ON A.Site = B.Site AND A.OrderNo = B.OrderNo |
|||
INNER JOIN SFDC C ON B.Site = C.Site AND B.OrderNo = C.OrderNo AND B.SeqNo = C.AssJobSeqNo |
|||
INNER JOIN Part P ON A.Site = P.Site AND A.PartNo = P.PartNo |
|||
<where> |
|||
<include refid="workOrderDetailsBaseConditions"/> |
|||
</where> |
|||
GROUP BY |
|||
A.Site, |
|||
A.OrderNo, |
|||
A.OrderType, |
|||
B.SeqNo, |
|||
A.PartNo, |
|||
P.PartDescription, |
|||
A.LotSize, |
|||
A.batch_no, |
|||
A.create_date, |
|||
B.PlanFinishTime, |
|||
B.finishtime, |
|||
B.S_ScheduledDate, |
|||
B.ClosedDate, |
|||
C.OperatorID, |
|||
C.ReportDate, |
|||
C.Scheduled_ShiftNo, |
|||
C.WorkCenterNo |
|||
ORDER BY B.SeqNo, C.ReportDate |
|||
</select> |
|||
|
|||
<!-- 根据allocType查询工单汇总数据 --> |
|||
<select id="selectByAllocType" parameterType="com.gaotao.modules.shopOrder.entity.UspWorkOrderAllocData" |
|||
resultType="com.gaotao.modules.shopOrder.entity.UspWorkOrderAllocData"> |
|||
SELECT |
|||
site, |
|||
orderNo, |
|||
batchNo, |
|||
erp_orderNo as erpOrderNo, |
|||
erp_orderLineNo as erpOrderLineNo, |
|||
rowNo, |
|||
itemNo, |
|||
operator, |
|||
allocReportQty, |
|||
allocApproveQty, |
|||
allocScrapQty, |
|||
allocSetupTime, |
|||
allocManfTime, |
|||
allocBy, |
|||
allocDate, |
|||
synced_date as syncedDate, |
|||
synced_mes as syncedMes, |
|||
allocType |
|||
FROM UspWorkOrderAlloc |
|||
<where> |
|||
<if test="site != null and site != ''"> |
|||
AND site = #{site} |
|||
</if> |
|||
<if test="orderNo != null and orderNo != ''"> |
|||
AND orderNo = #{orderNo} |
|||
</if> |
|||
<if test="allocType != null and allocType != ''"> |
|||
AND allocType = #{allocType} |
|||
</if> |
|||
</where> |
|||
ORDER BY allocDate DESC |
|||
</select> |
|||
|
|||
<!-- 查询未传输的数据 --> |
|||
<select id="selectUnSyncedData" parameterType="com.gaotao.modules.shopOrder.entity.UspWorkOrderAllocData" |
|||
resultType="com.gaotao.modules.shopOrder.entity.UspWorkOrderAllocData"> |
|||
SELECT |
|||
site, |
|||
orderNo, |
|||
ROW_NUMBER() OVER (ORDER BY MAX(ReportDate) ASC) AS batchNo, |
|||
erp_orderNo as erpOrderNo, |
|||
erp_orderLineNo as erpOrderLineNo, |
|||
ROW_NUMBER() OVER (ORDER BY MAX(ReportDate) ASC) AS rowNo, |
|||
MAX(operation_id) as itemNo, |
|||
operator, |
|||
SUM(ISNULL(allocReportQty,0)), |
|||
SUM(ISNULL(allocApproveQty,0)), |
|||
SUM(ISNULL(allocScrapQty,0)), |
|||
SUM(ISNULL(allocSetupTime,0)) allocSetupTime, |
|||
SUM(ISNULL(allocManfTime,0)) allocManfTime, |
|||
MAX(allocBy )AS allocBy, |
|||
MAX(ReportDate) AS allocDate, |
|||
'' allocType |
|||
FROM UspWorkOrderAlloc |
|||
<where> |
|||
AND (allocType = '产量未传输' OR allocType = '工时未传输') |
|||
<if test="site != null and site != ''"> |
|||
AND site = #{site} |
|||
</if> |
|||
<if test="site == null or site == ''"> |
|||
AND site in (select site from AccessSite where userID = #{currentUser}) |
|||
</if> |
|||
<if test="orderNo != null and orderNo != ''"> |
|||
AND orderNo = #{orderNo} |
|||
</if> |
|||
</where> |
|||
GROUP BY site , orderNo , erp_orderNo , erp_orderLineNo , operator |
|||
</select> |
|||
|
|||
<!-- 更新SFDC表的同步信息 --> |
|||
<update id="updateSfdcSyncedCode"> |
|||
UPDATE SFDC |
|||
SET synced_code = #{syncedCode}, |
|||
synced_flag = 'Y' |
|||
WHERE Site = #{site} |
|||
AND OrderNo = #{orderNo} |
|||
AND ItemNo = #{batchNo} |
|||
</update> |
|||
|
|||
<!-- 更新UspWorkOrderAlloc的同步异常信息 --> |
|||
<update id="updateAllocSyncedError"> |
|||
UPDATE UspWorkOrderAlloc |
|||
SET synced_date = GETDATE(), |
|||
synced_mes = #{syncedMes} |
|||
WHERE site = #{site} |
|||
AND orderNo = #{orderNo} |
|||
AND rowNo = #{rowNo} |
|||
</update> |
|||
|
|||
<!-- 更新UspWorkOrderAlloc的同步成功信息 --> |
|||
<update id="updateAllocSyncedSuccess"> |
|||
UPDATE UspWorkOrderAlloc |
|||
SET |
|||
allocType = CASE WHEN allocType = '产量未传输' THEN '产量已传输' WHEN allocType = '工时未传输' THEN '工时已传输' END, |
|||
synced_date = GETDATE(), |
|||
synced_mes = '操作成功' |
|||
WHERE site = #{site} |
|||
AND orderNo = #{orderNo} |
|||
AND allocType IN ('产量未传输', '工时未传输') |
|||
</update> |
|||
|
|||
</mapper> |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue