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