Merge branch 'master' of http://bore.pub:10439/r/ERP_override
| | |
| | | <script setup> |
| | | |
| | | import BasicTable from "@/components/BasicTable.vue" |
| | | import BasicTable from "@/components/BrokenReportTemplate.vue" |
| | | import request from "@/utils/request" |
| | | import { ref} from "vue" |
| | | import { useI18n } from 'vue-i18n' |
| | | import companyInfo from "@/stores/sd/companyInfo"; |
| | | |
| | | //语言获取 |
| | | const { t } = useI18n() |
| | | |
| | | const company = companyInfo() |
| | | const childrenData = ref({ |
| | | columns:[ |
| | | {type: 'seq',fixed:"left", title: t('basicData.Number'), width: '80' }, |
| | |
| | | {field: 'staterOperationOrderNumber', width: '150',title: t('productStock.staterOperationOrderNumber'),filters:[{ data: '' }],slots: { filter: 'num1_filter' }}, |
| | | {field: 'endOperationOrderNumber', width: '100',title: t('productStock.endOperationOrderNumber'),filters:[{ data: '' }],slots: { filter: 'num1_filter' }}, |
| | | {field: 'operator', width: '100',title: t('productStock.creator'),filters:[{ data: '' }],slots: { filter: 'num1_filter' }}, |
| | | {field: 'operateTime', width:'140', title: t('productStock.productionDate'),filters:[{ data: '' }],slots: { filter: 'num1_filter' }}, |
| | | {field: 'operateTime', width:'140', title: t('productStock.storageTime'),filters:[{ data: '' }],slots: { filter: 'num1_filter' }}, |
| | | {field: 'processId', width:'140', title: t('processCard.processId'),filters:[{ data: '' }],slots: { filter: 'num1_filter' }}, |
| | | {field: 'type', width:'140', title: t('productStock.typeClaim'),filters:[{ data: '' }],slots: { filter: 'num1_filter' }}, |
| | | {field: 'reviewed', width: '100',title: t('productStock.reviewed'),filters:[{ data: '' }],slots: { filter: 'num1_filter' }}, |
| | |
| | | ],//表格表头字段 |
| | | data:[],//表格数据 |
| | | url :'/finishedGoodsInventory/getSelectFinishedOperateLogReport/入库', |
| | | exportUrl :'/finishedGoodsInventory/exportFinishedOperateLogReport/入库', |
| | | exportUrl :`/finishedGoodsInventory/exportFinishedOperateLogReportByDatetime/入库`, |
| | | exportName:t('stockReport.finishedProductInventoryReport'), |
| | | footList:['quantity','area','money','squareMillimeter'] |
| | | }) |
| | |
| | | }
|
| | | adjustGrayRectangles(layoutIndex);
|
| | | } else {
|
| | | // 旋转失败,恢复原始尺寸
|
| | | glassDetail.width = originalState.width;
|
| | | glassDetail.height = originalState.height;
|
| | | ElMessage.warning('无法旋转,存在重叠或超出边界');
|
| | |
|
| | | // 尝试向上移动并旋转
|
| | | const upResult = tryMoveAndRotate(layoutIndex, rectIndex, 'up');
|
| | | if (!upResult) {
|
| | | ElMessage.warning('无法旋转,即使移动后仍存在重叠或超出边界');
|
| | | }
|
| | | }
|
| | | };
|
| | |
|
| | | // 辅助方法:尝试移动并旋转
|
| | | const tryMoveAndRotate = (layoutIndex, rectIndex, direction) => {
|
| | | // 保存原始状态
|
| | | const layout = layouts.value[layoutIndex];
|
| | | const glassDetail = layout.glassDetails[rectIndex];
|
| | | const originalPosition = {
|
| | | x: glassDetail.x,
|
| | | y: glassDetail.y,
|
| | | width: glassDetail.width,
|
| | | height: glassDetail.height
|
| | | };
|
| | |
|
| | | let success = false;
|
| | |
|
| | | if (direction === 'up') {
|
| | | // 尝试向上移动并旋转
|
| | | moveRectAndRotate(layoutIndex, rectIndex, 'down');
|
| | |
|
| | | // 检查是否成功
|
| | | const otherRects = layout.glassDetails.filter(r => !r.isRemain && r !== glassDetail);
|
| | | let hasOverlap = false;
|
| | |
|
| | | otherRects.forEach(otherRect => {
|
| | | if (checkOverlap(glassDetail, otherRect)) {
|
| | | hasOverlap = true;
|
| | | }
|
| | | });
|
| | |
|
| | | if (!hasOverlap &&
|
| | | glassDetail.x + glassDetail.width <= layout.width &&
|
| | | glassDetail.y + glassDetail.height <= layout.height &&
|
| | | glassDetail.x >= 0 && glassDetail.y >= 0) {
|
| | | success = true;
|
| | | // 如果向上移动并旋转成功,则再向下移动,让矩形靠近底部
|
| | | moveRect(layoutIndex, rectIndex, 'up');
|
| | | } else {
|
| | | // 向上移动并旋转失败,恢复原始状态
|
| | | glassDetail.x = originalPosition.x;
|
| | | glassDetail.y = originalPosition.y;
|
| | | glassDetail.width = originalPosition.width;
|
| | | glassDetail.height = originalPosition.height;
|
| | | }
|
| | | } else if (direction === 'down') {
|
| | | // 尝试向下移动并旋转
|
| | | moveRectAndRotate(layoutIndex, rectIndex, 'up');
|
| | |
|
| | | // 检查是否成功
|
| | | const otherRects = layout.glassDetails.filter(r => !r.isRemain && r !== glassDetail);
|
| | | let hasOverlap = false;
|
| | |
|
| | | otherRects.forEach(otherRect => {
|
| | | if (checkOverlap(glassDetail, otherRect)) {
|
| | | hasOverlap = true;
|
| | | }
|
| | | });
|
| | |
|
| | | if (!hasOverlap &&
|
| | | glassDetail.x + glassDetail.width <= layout.width &&
|
| | | glassDetail.y + glassDetail.height <= layout.height &&
|
| | | glassDetail.x >= 0 && glassDetail.y >= 0) {
|
| | | success = true;
|
| | | // 如果向下移动并旋转成功,则再向上移动,让矩形靠近顶部
|
| | | moveRect(layoutIndex, rectIndex, 'down');
|
| | | } else {
|
| | | // 向下移动并旋转失败,恢复原始状态
|
| | | glassDetail.x = originalPosition.x;
|
| | | glassDetail.y = originalPosition.y;
|
| | | glassDetail.width = originalPosition.width;
|
| | | glassDetail.height = originalPosition.height;
|
| | | }
|
| | | }
|
| | |
|
| | | return success;
|
| | | };
|
| | |
|
| | | //移动旋转方法
|
| | | const moveRectAndRotate = (layoutIndex, rectIndex, direction) => {
|
| | | const layout = layouts.value[layoutIndex];
|
| | | const glassDetail = layout.glassDetails[rectIndex];
|
| | | const grayRects = layout.glassDetails.filter(r => r.isRemain);
|
| | |
|
| | | // 先移动
|
| | | moveRect(layoutIndex, rectIndex, direction);
|
| | |
|
| | | // 再旋转
|
| | | const originalState = { ...glassDetail };
|
| | | const temp = glassDetail.width;
|
| | | glassDetail.width = glassDetail.height;
|
| | | glassDetail.height = temp;
|
| | |
|
| | | const canPlace = grayRects.some(grayRect => {
|
| | | return grayRect.width >= glassDetail.width && grayRect.height >= glassDetail.height;
|
| | | const otherRects = layout.glassDetails.filter(r => !r.isRemain && r !== glassDetail);
|
| | | let isValidRotation = true;
|
| | |
|
| | | otherRects.forEach(otherRect => {
|
| | | if (checkOverlap(glassDetail, otherRect)) {
|
| | | isValidRotation = false;
|
| | | }
|
| | | });
|
| | |
|
| | | if (!canPlace) {
|
| | | const temp = glassDetail.width;
|
| | | glassDetail.width = glassDetail.height;
|
| | | glassDetail.height = temp;
|
| | | ElMessage.warning('无法旋转,没有足够的空间');
|
| | | return;
|
| | | if (glassDetail.x + glassDetail.width > layout.width || glassDetail.y + glassDetail.height > layout.height) {
|
| | | isValidRotation = false;
|
| | | }
|
| | |
|
| | | adjustGrayRectangles(layoutIndex);
|
| | | moveRect(layoutIndex, rectIndex, direction);
|
| | | if (isValidRotation) {
|
| | | // 更新glassPoint坐标(如果存在)
|
| | | if (glassDetail.glassPoint && Array.isArray(glassDetail.glassPoint)) {
|
| | | const originalPoints = JSON.parse(JSON.stringify(glassDetail.glassPoint));
|
| | | glassDetail.glassPoint.forEach((point, index) => {
|
| | | const relX = originalPoints[index].X - originalState.x;
|
| | | const relY = originalPoints[index].Y - originalState.y;
|
| | | point.X = originalState.x + relY;
|
| | | point.Y = originalState.y + (originalState.width - relX);
|
| | | point.X = parseFloat(point.X.toFixed(2));
|
| | | point.Y = parseFloat(point.Y.toFixed(2));
|
| | | });
|
| | | }
|
| | | adjustGrayRectangles(layoutIndex);
|
| | | } else {
|
| | | // 旋转失败,恢复原始尺寸和位置
|
| | | glassDetail.width = originalState.width;
|
| | | glassDetail.height = originalState.height;
|
| | | // 恢复移动前的位置
|
| | | moveRect(layoutIndex, rectIndex, getReverseDirection(direction));
|
| | | ElMessage.warning('无法旋转,存在重叠或超出边界');
|
| | | }
|
| | | };
|
| | |
|
| | | // 获取反向方向的辅助函数
|
| | | const getReverseDirection = (direction) => {
|
| | | switch (direction) {
|
| | | case 'up': return 'down';
|
| | | case 'down': return 'up';
|
| | | case 'left': return 'right';
|
| | | case 'right': return 'left';
|
| | | default: return direction;
|
| | | }
|
| | | };
|
| | |
|
| | | //移动方法
|
| | |
| | | if ($grid) { |
| | | switch (code) { |
| | | case 'add': { |
| | | submit.value.glassLevel = [null,null] |
| | | submit.value.processType = null |
| | | submit.value.processName = null |
| | | submit.value.inputType = null |
| | | submit.value.id = null |
| | | rowIndex.value = null |
| | | dialogTableVisible.value = true |
| | | break |
| | | } |
| | |
| | | import javax.servlet.http.HttpServletResponse; |
| | | import java.io.IOException; |
| | | import java.time.LocalDate; |
| | | import java.time.LocalDateTime; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | |
| | |
| | | return Result.success(finishedGoodsInventoryService.getSelectFinishedOperateLogReport(type,pageNum,pageSize,selectDate,finishedOperateLog)); |
| | | } |
| | | |
| | | @ApiOperation("成品库存记录查询接口日期时间查询") |
| | | @SaCheckPermission("warehouseReport.search") |
| | | @PostMapping("/getSelectFinishedOperateLogReport/{type}/{pageNum}/{pageSize}/{selectDate}/{reportTime}") |
| | | public Result getSelectFinishedOperateLogReportByDatetime(@PathVariable String type,@PathVariable Integer pageNum, @PathVariable Integer pageSize,@PathVariable List<String> selectDate,@PathVariable String reportTime, @RequestBody FinishedOperateLog finishedOperateLog){ |
| | | return Result.success(finishedGoodsInventoryService.getSelectFinishedOperateLogReportByDateTime(type,pageNum,pageSize,selectDate,reportTime,finishedOperateLog)); |
| | | } |
| | | |
| | | |
| | | @ApiOperation("成品报表导出") |
| | | @PostMapping("/exportFinishedOperateLogReport/{type}") |
| | | public void exportFinishedOperateLogReport(@PathVariable String type,HttpServletResponse response, @RequestBody List<LocalDate> dates) throws IOException, IllegalAccessException, InstantiationException { |
| | |
| | | DownExcel.download(response, FinishedOperateLogDTO.class, finishedGoodsInventoryService.exportFinishedOperateLogReport(dates,type),"orderReport"); |
| | | } |
| | | |
| | | @ApiOperation("成品报表导出日期时间") |
| | | @PostMapping("/exportFinishedOperateLogReportByDatetime/{type}") |
| | | public void exportFinishedOperateLogReportByDatetime( |
| | | @PathVariable String type,HttpServletResponse response, |
| | | @RequestBody List<String> dates) throws IOException, IllegalAccessException, InstantiationException { |
| | | //参数:相应的数据,实体类信息,相应的方法(数据获取),生成的excel名字 |
| | | DownExcel.download(response, FinishedOperateLogDTO.class, finishedGoodsInventoryService.exportFinishedOperateLogReportByDatetime(dates,type),"orderReport"); |
| | | } |
| | | |
| | | |
| | | /*订单一键入库*/ |
| | | @ApiOperation("订单一键入库") |
| | |
| | | } |
| | | |
| | | |
| | | @PostMapping("/calculate") |
| | | @PostMapping("/mesCalculate") |
| | | public ResponseEntity<Map<String, Object>> receiveOptimizeRequest( |
| | | @RequestBody Map<String, Object> requestData) { |
| | | |
| | |
| | | response.put("msg", "success"); |
| | | response.put("data", ""); |
| | | |
| | | // 异步处理计算任务 |
| | | // todo 异步处理计算任务 |
| | | // glassOptimizeService.processExternalOptimizeRequest(requestData); |
| | | System.out.println(requestData); |
| | | |
| | |
| | | |
| | | List<FinishedOperateLog> getSelectFinishedOperateLogReport(@Param("offset") Integer offset, |
| | | @Param("pageSize") Integer pageSize,String startDate, String endDate, |
| | | @Param("finishedOperateLog") FinishedOperateLog finishedOperateLog,String type); |
| | | @Param("finishedOperateLog") FinishedOperateLog finishedOperateLog,String type, |
| | | @Param("dateType") String dateType); |
| | | |
| | | Map<String,Integer> getSelectFinishedOperateLogReportPageTotal(@Param("offset") Integer offset, |
| | | @Param("pageSize") Integer pageSize,String startDate, String endDate, |
| | | @Param("finishedOperateLog") FinishedOperateLog finishedOperateLog,String type); |
| | | @Param("finishedOperateLog") FinishedOperateLog finishedOperateLog, |
| | | String type, |
| | | @Param("dateType") String dateType); |
| | | |
| | | List<FinishedOperateLogDTO> exportFinishedOperateLogReport(List<LocalDate> dates,String type); |
| | | |
| | | List<FinishedOperateLogDTO> exportFinishedOperateLogReportByDatetime(List<String> dates,String type); |
| | | Boolean insertOrderFinishedOperateLog(@Param("orderDetail") OrderDetail orderDetail,@Param("userName") String userName, |
| | | @Param("oddNumber") String oddNumber,@Param("processId") String processId); |
| | | |
| | |
| | | public interface ReportingWorkMapper extends MPJBaseMapper<ReportingWork> { |
| | | |
| | | |
| | | ReportingWork AddSelectLastWorkMp(String processIdStr, String technologyStr, String previousProcess, String nextProcess, String process, String reportType); |
| | | ReportingWork AddSelectLastWorkMp(String processIdStr, |
| | | String technologyStr, |
| | | String previousProcess, |
| | | String nextProcess, |
| | | String process, |
| | | String reportType); |
| | | |
| | | List<BasicDataProduce> SelectWorkBasicDeviceMp(String process); |
| | | |
| | |
| | | import java.text.SimpleDateFormat; |
| | | import java.time.LocalDate; |
| | | import java.time.LocalDateTime; |
| | | import java.time.LocalTime; |
| | | import java.time.format.DateTimeFormatter; |
| | | import java.util.*; |
| | | |
| | | @Service |
| | |
| | | } |
| | | |
| | | Map<String, Object> map = new HashMap<>(); |
| | | map.put("data", finishedOperateLogMapper.getSelectFinishedOperateLogReport(offset, pageSize,startDate, endDate, finishedOperateLog,type)); |
| | | map.put("total", finishedOperateLogMapper.getSelectFinishedOperateLogReportPageTotal(offset, pageSize,startDate, endDate, finishedOperateLog,type)); |
| | | map.put("data", finishedOperateLogMapper.getSelectFinishedOperateLogReport(offset, pageSize,startDate, endDate, finishedOperateLog,type,"date")); |
| | | map.put("total", finishedOperateLogMapper.getSelectFinishedOperateLogReportPageTotal(offset, pageSize,startDate, endDate, finishedOperateLog,type,"date")); |
| | | List<String> list = new ArrayList<>(); |
| | | list.add(startDate); |
| | | list.add(endDate); |
| | |
| | | |
| | | return map; |
| | | } |
| | | |
| | | public Map<String, Object> getSelectFinishedOperateLogReportByDateTime(String type, Integer pageNum, Integer pageSize, List<String> selectDate, String reportTime, FinishedOperateLog finishedOperateLog) { |
| | | Integer offset = (pageNum-1)*pageSize; |
| | | String startDate = toReportTime(LocalDate.now().minusDays(7).toString(), reportTime); |
| | | String endDate = toReportTime(LocalDate.now().toString(), reportTime); |
| | | |
| | | // 如果前端传了时间,就用前端日期 + reportTime |
| | | if (selectDate != null && selectDate.size() == 2) { |
| | | if (selectDate.get(0) != null && !selectDate.get(0).isEmpty()) { |
| | | startDate = toReportTime(selectDate.get(0), reportTime); |
| | | } |
| | | if (selectDate.get(1) != null && !selectDate.get(1).isEmpty()) { |
| | | endDate = toReportTime(selectDate.get(1), reportTime); |
| | | } |
| | | } |
| | | |
| | | Map<String, Object> map = new HashMap<>(); |
| | | map.put("data", finishedOperateLogMapper.getSelectFinishedOperateLogReport(offset, pageSize,startDate, endDate, finishedOperateLog,type,"datetime")); |
| | | map.put("total", finishedOperateLogMapper.getSelectFinishedOperateLogReportPageTotal(offset, pageSize,startDate, endDate, finishedOperateLog,type,"datetime")); |
| | | List<String> list = new ArrayList<>(); |
| | | list.add(startDate); |
| | | list.add(endDate); |
| | | map.put("selectDate",list); |
| | | return map; |
| | | } |
| | | |
| | | private static final DateTimeFormatter DATE_TIME_FMT = |
| | | DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); |
| | | |
| | | private String toReportTime(String dateStr, String reportTime) { |
| | | if (dateStr == null || dateStr.isEmpty()) { |
| | | return null; |
| | | } |
| | | |
| | | // 只保留 yyyy-MM-dd,防止前端传完整时间导致 parse 异常 |
| | | String onlyDate = dateStr.length() > 10 ? dateStr.substring(0, 10) : dateStr; |
| | | |
| | | |
| | | String[] parts = reportTime.split(":"); |
| | | int hour = Integer.parseInt(parts[0]); |
| | | int minute = parts.length > 1 ? Integer.parseInt(parts[1]) : 0; |
| | | int second = parts.length > 2 ? Integer.parseInt(parts[2]) : 0; |
| | | |
| | | LocalDate date = LocalDate.parse(onlyDate); |
| | | LocalTime time = LocalTime.of(hour, minute, second); |
| | | |
| | | return LocalDateTime.of(date, time).format(DATE_TIME_FMT); |
| | | } |
| | | |
| | | public List<FinishedOperateLogDTO> exportFinishedOperateLogReportByDatetime(List<String> dates, String type) { |
| | | return finishedOperateLogMapper.exportFinishedOperateLogReportByDatetime(dates,type); |
| | | } |
| | | } |
| | |
| | | left join sd.`order` o on o.order_id=fol.order_id |
| | | left join sd.product p on p.id=od.product_id |
| | | <where> |
| | | date(fol.operate_time)>=#{startDate} and date(fol.operate_time) <= #{endDate} and fol.operate_type=#{type} |
| | | <if test="dateType=='date'"> |
| | | date(fol.operate_time)>=#{startDate} and date(fol.operate_time) <= #{endDate} |
| | | </if> |
| | | <if test="dateType=='datetime'"> |
| | | fol.operate_time>=#{startDate} and fol.operate_time <= #{endDate} |
| | | </if> |
| | | and fol.operate_type=#{type} |
| | | |
| | | <if test="finishedOperateLog.operateType != null and finishedOperateLog.operateType != ''"> |
| | | and fol.operate_type regexp #{finishedOperateLog.operateType} |
| | | </if> |
| | |
| | | left join sd.`order` o on o.order_id=fol.order_id |
| | | left join sd.product p on p.id=od.product_id |
| | | <where> |
| | | date(fol.operate_time)>=#{startDate} and date(fol.operate_time) <= #{endDate} and fol.operate_type=#{type} |
| | | <if test="dateType=='date'"> |
| | | date(fol.operate_time)>=#{startDate} and date(fol.operate_time) <= #{endDate} |
| | | </if> |
| | | <if test="dateType=='datetime'"> |
| | | fol.operate_time>=#{startDate} and fol.operate_time <= #{endDate} |
| | | </if> |
| | | and fol.operate_type=#{type} |
| | | |
| | | |
| | | <if test="finishedOperateLog.operateType != null and finishedOperateLog.operateType != ''"> |
| | | and fol.operate_type regexp #{finishedOperateLog.operateType} |
| | | </if> |
| | |
| | | left join sd.order_detail od on fol.order_id = od.order_id and fol.operation_number = od.order_number |
| | | left join sd.`order` o on o.order_id=fol.order_id |
| | | left join sd.product p on p.id=od.product_id |
| | | where date(fol.operate_time)>=#{dates[0]} and date(fol.operate_time) <= #{dates[1]} and fol.operate_type=#{type} |
| | | where |
| | | date(fol.operate_time)>=#{dates[0]} and date(fol.operate_time) <= #{dates[1]} |
| | | |
| | | and fol.operate_type=#{type} |
| | | |
| | | </select> |
| | | |
| | | <select id="exportFinishedOperateLogReportByDatetime"> |
| | | select fol.id, |
| | | fol.operation_order_number, |
| | | fol.order_id, |
| | | fol.operate_type, |
| | | fol.process_id, |
| | | fol.operation_number, |
| | | fol.quantity, |
| | | fol.operator, |
| | | od.product_id, |
| | | od.product_name, |
| | | od.width, |
| | | od.height, |
| | | fol.stater_operation_order_number, |
| | | fol.end_operation_order_number, |
| | | fol.operate_time, |
| | | fol.`status`, |
| | | fol.is_state, |
| | | fol.reviewed, |
| | | fol.reviewed_time, |
| | | fol.type, |
| | | fol.remarks, |
| | | fol.area, |
| | | fol.money, |
| | | o.customer_name, |
| | | o.project, |
| | | od.price, |
| | | o.order_type, |
| | | p.thickness * fol.area as square_millimeter |
| | | from (select * |
| | | from mm.finished_operate_log aa where aa.status!='已作废') fol |
| | | left join sd.order_detail od on fol.order_id = od.order_id and fol.operation_number = od.order_number |
| | | left join sd.`order` o on o.order_id=fol.order_id |
| | | left join sd.product p on p.id=od.product_id |
| | | where |
| | | fol.operate_time>=#{dates[0]} and fol.operate_time <= #{dates[1]} |
| | | |
| | | and fol.operate_type=#{type} |
| | | |
| | | </select> |
| | | |
| | |
| | | SELECT g.* |
| | | ,GROUP_CONCAT(g.glass_child SEPARATOR '+') as childName |
| | | from( SELECT f.*, |
| | | e.reporting_work_num_count+f.patchNumSum-f.reporting_work_num_count-f.broken_num as quantity, |
| | | (e.reporting_work_num_count+f.patchNumSum-f.reporting_work_num_count-f.broken_num)*f.area as glassArea |
| | | if((e.reporting_work_num_count+f.patchNumSum-f.reporting_work_num_count-f.broken_num-f.termination_quantity)>0, |
| | | (e.reporting_work_num_count+f.patchNumSum-f.reporting_work_num_count-f.broken_num-f.termination_quantity), |
| | | 0 |
| | | ) as quantity, |
| | | if((e.reporting_work_num_count+f.patchNumSum-f.reporting_work_num_count-f.broken_num-f.termination_quantity)>0, |
| | | (e.reporting_work_num_count+f.patchNumSum-f.reporting_work_num_count-f.broken_num-f.termination_quantity) , |
| | | 0)*f.area as glassArea |
| | | from (SELECT a.order_id, |
| | | if(a.batch!="",CONCAT(a.project,'(',a.batch,')'),a.project) as project, |
| | | C.product_id, |
| | |
| | | b.id, |
| | | c.area, |
| | | d.glass_child, |
| | | ifnull(cb.patchNumSum,0) as patchNumSum |
| | | ifnull(cb.patchNumSum,0) as patchNumSum, |
| | | fc.termination_quantity |
| | | |
| | | FROM sd.`order` as a |
| | | LEFT JOIN sd.order_process_detail as b |
| | |
| | | |
| | | |
| | | ) as h |
| | | where h.quantity >0 |
| | | <choose> |
| | | <when test="optionVal == 1"> |
| | | GROUP BY thisProcess |
| | |
| | | process_attribute_config as a |
| | | set a.process_type = #{processAttributeConfig.processType}, |
| | | a.process_name = #{processAttributeConfig.processName}, |
| | | a.input_type = #{processAttributeConfig.inputType}, |
| | | a.input_type = #{processAttributeConfig.inputType} |
| | | where a.id = #{processAttributeConfig.id} |
| | | </update> |
| | | |