Merge remote-tracking branch 'origin/master'
| | |
| | | request.post(`/finishedGoodsInventory/getSelectStorageRecord/1/${total.pageSize}/${selectDate.value}/${type.value}`,filterData.value).then((res) => { |
| | | |
| | | if(res.code==200){ |
| | | if(type.value==='入库'){ |
| | | let quantityAvailable={field: 'quantityAvailable', width: '140',title: t('productStock.inventoryQuantity')} |
| | | let cancelAvailable={field: 'cancelAvailable', width: '140',title: t('ingredientsStock.returnQuantity'),editRender: { name: 'input' }} |
| | | gridOptions.columns.splice(8, 0, quantityAvailable,cancelAvailable) |
| | | } |
| | | total.dataTotal = res.data.total.total*1 |
| | | total.pageTotal= res.data.total.pageTotal |
| | | selectDate.value = res.data.selectDate |
| | |
| | | request.post(`/finishedGoodsInventory/getSelectStorageRecord/1/${total.pageSize}/${selectDate.value}/${type.value}`,filterData.value).then((res) => { |
| | | |
| | | if(res.code==200){ |
| | | if(type.value==='入库'){ |
| | | let quantityAvailable={field: 'quantityAvailable', width: '140',title: t('productStock.inventoryQuantity')} |
| | | let cancelAvailable={field: 'cancelAvailable', width: '140',title: t('ingredientsStock.returnQuantity'),editRender: { name: 'input' }} |
| | | gridOptions.columns.splice(8, 0, quantityAvailable,cancelAvailable) |
| | | } |
| | | total.dataTotal = res.data.total.total*1 |
| | | total.pageTotal= res.data.total.pageTotal |
| | | |
| | |
| | | const selectOrderList = ()=>{ |
| | | request.post(`/finishedGoodsInventory/getSelectStorageRecord/${pageNum.value}/${total.pageSize}/${selectDate.value}/${type.value}`,filterData.value).then((res) => { |
| | | if(res.code==200){ |
| | | if(type.value==='入库'){ |
| | | let quantityAvailable={field: 'quantityAvailable', width: '140',title: t('productStock.inventoryQuantity')} |
| | | let cancelAvailable={field: 'cancelAvailable', width: '140',title: t('ingredientsStock.returnQuantity'),editRender: { name: 'input' }} |
| | | gridOptions.columns.splice(8, 0, quantityAvailable,cancelAvailable) |
| | | } |
| | | selectDate.value = res.data.selectDate |
| | | if (res.data.total!=null){ |
| | | total.dataTotal = res.data.total.total*1 |
| | |
| | | }) |
| | | |
| | | const gridEvents = { |
| | | toolbarButtonClick ({ code }) { |
| | | async toolbarButtonClick({code}) { |
| | | const $grid = xGrid.value |
| | | if ($grid) { |
| | | switch (code) { |
| | |
| | | ElMessage.warning(t('productStock.unselectedData')) |
| | | return |
| | | } |
| | | const errMap = await $grid.validate(selectRecords) |
| | | if (errMap) { |
| | | return |
| | | } |
| | | let flowData = ref({ |
| | | |
| | | userId:userid, |
| | | userName:username, |
| | | orderDetail:selectRecords |
| | | userId: userid, |
| | | userName: username, |
| | | orderDetail: selectRecords |
| | | |
| | | }) |
| | | gridOptions.toolbarConfig.buttons[1].disabled = true |
| | | request.post("/finishedGoodsInventory/cancelFinishedGoodsInventoryStorage",flowData.value).then((res) => { |
| | | if(res.code==200 && res.data==="true"){ |
| | | request.post("/finishedGoodsInventory/cancelFinishedGoodsInventoryStorage", flowData.value).then((res) => { |
| | | if (res.code == 200 && res.data === "true") { |
| | | ElMessage.success(t('productStock.invalidSuccessfully')) |
| | | router.push({path:'/main/productStock/storageRecord',query:{random:Math.random(),storageType: type.value}}) |
| | | router.push({ |
| | | path: '/main/productStock/storageRecord', |
| | | query: {random: Math.random(), storageType: type.value} |
| | | }) |
| | | |
| | | }else if(res.data==="false1"){ |
| | | } else if (res.data === "false3") { |
| | | ElMessage.warning(t('productStock.msg4')) |
| | | }else if(res.data==="false2"){ |
| | | } else if (res.data === "false2") { |
| | | ElMessage.warning(t('productStock.msg5')) |
| | | }else{ |
| | | } else { |
| | | ElMessage.warning(t('productStock.cancellationFailed')) |
| | | } |
| | | }).catch((err)=>{ |
| | | }).catch((err) => { |
| | | ElMessage.error(t('basicData.msg.ServerConnectionError')) |
| | | router.push("/login") |
| | | }).finally(()=>{ |
| | | }).finally(() => { |
| | | gridOptions.toolbarConfig.buttons[1].disabled = false |
| | | }) |
| | | } |
| | |
| | | reserve:true |
| | | } |
| | | |
| | | const validRules = ref({ |
| | | "cancelAvailable": [{ |
| | | validator (e) { |
| | | if (parseInt(e.row.cancelAvailable) > e.row.quantity) { |
| | | return new Error(t('ingredientsStock.msg2')) |
| | | } |
| | | const regex = /^[1-9]\d*$/g |
| | | if ( !regex.test(e.row.cancelAvailable) ) { |
| | | return new Error(t('basicData.msg.greater0')) |
| | | } |
| | | |
| | | } |
| | | |
| | | }] |
| | | |
| | | }) |
| | | |
| | | |
| | | </script> |
| | |
| | | v-bind="gridOptions" |
| | | v-on="gridEvents" |
| | | :checkbox-config="checkBoxConfig" |
| | | :edit-rules="validRules" |
| | | |
| | | > |
| | | |
| | |
| | | |
| | | import com.example.erp.common.Result; |
| | | import com.example.erp.entity.sd.Order; |
| | | import com.example.erp.service.mm.FinishedGoodsInventoryService; |
| | | import com.example.erp.service.mm.MaterialInventoryService; |
| | | import com.example.erp.service.sd.DeliveryService; |
| | | import com.example.erp.service.sd.OrderService; |
| | |
| | | private final OrderService orderService; |
| | | private final DeliveryService deliveryService; |
| | | private final MaterialInventoryService materialInventoryService; |
| | | private final FinishedGoodsInventoryService finishedGoodsInventoryService; |
| | | |
| | | @ApiOperation("订单报表") |
| | | @PostMapping("/getOrderList") |
| | |
| | | public Result getOriginalGlassList() { |
| | | return Result.success(materialInventoryService.appGetStockList()); |
| | | } |
| | | |
| | | |
| | | @ApiOperation("成品库存报表") |
| | | @PostMapping("/getFinishedGoodsInventoryList") |
| | | public Result getFinishedGoodsInventoryList() { |
| | | return Result.success(finishedGoodsInventoryService.appFinishedGoodsInventoryList()); |
| | | } |
| | | } |
| | |
| | | package com.example.erp.entity.mm; |
| | | |
| | | import com.baomidou.mybatisplus.annotation.IdType; |
| | | import com.baomidou.mybatisplus.annotation.TableField; |
| | | import com.baomidou.mybatisplus.annotation.TableId; |
| | | import com.example.erp.entity.sd.Order; |
| | | import com.example.erp.entity.sd.OrderDetail; |
| | |
| | | private Double money; |
| | | private Double computeArea; |
| | | |
| | | /*库存数量*/ |
| | | @TableField(select = false,exist = false) |
| | | private Integer quantityAvailable; |
| | | |
| | | /*撤销数量*/ |
| | | @TableField(select = false,exist = false) |
| | | private Integer cancelAvailable; |
| | | |
| | | private OrderDetail orderDetail; |
| | | |
| | | private Order order; |
| | |
| | | List<Map<String, Object>> getPrintDetail(String orderId, String boxNo, Integer productId, String thickness); |
| | | |
| | | Boolean deleteFinishedGoodsInventoryDate(); |
| | | |
| | | List<FinishedGoodsInventory> getFinishedGoodsInventoryList(); |
| | | } |
| | | |
| | | |
| | |
| | | @Param("userName") String userName, |
| | | @Param("type") String type); |
| | | |
| | | Boolean updateFinishedOperateLogQuantity(@Param("finishedOperateLog") FinishedOperateLog finishedOperateLog |
| | | ,@Param("deliveryDetailMoney") Double deliveryDetailMoney,@Param("deliveryDetailArea") Double deliveryDetailArea); |
| | | |
| | | Boolean updateFinishedOperateLogState(@Param("finishedOperateLog") FinishedOperateLog finishedOperateLog,@Param("type") String type); |
| | | |
| | | |
| | |
| | | import com.example.erp.dto.mm.FinishedOperateLogDTO; |
| | | import com.example.erp.entity.mm.FinishedGoodsInventory; |
| | | import com.example.erp.entity.mm.FinishedOperateLog; |
| | | import com.example.erp.entity.mm.MaterialInventory; |
| | | import com.example.erp.entity.pp.FlowCard; |
| | | import com.example.erp.entity.sd.Delivery; |
| | | import com.example.erp.entity.sd.DeliveryDetail; |
| | |
| | | import java.math.BigDecimal; |
| | | import java.math.RoundingMode; |
| | | import java.sql.SQLOutput; |
| | | import java.text.DecimalFormat; |
| | | import java.text.SimpleDateFormat; |
| | | import java.time.LocalDate; |
| | | import java.time.LocalDateTime; |
| | |
| | | .eq(FinishedGoodsInventory::getOrderNumber, finishedOperateLog.getOperationNumber()) |
| | | .eq(FinishedGoodsInventory::getBoxNo, finishedOperateLog.getRemarks()) |
| | | ); |
| | | if(delivery!=null){ |
| | | /*if(delivery!=null){ |
| | | return "false1"; |
| | | } |
| | | if(existFinishedGoodsInventory.getQuantityAvailable()<finishedOperateLog.getQuantity()){ |
| | | }*/ |
| | | if(existFinishedGoodsInventory.getQuantityAvailable()<finishedOperateLog.getCancelAvailable()){ |
| | | return "false2"; |
| | | } |
| | | |
| | | //修改记录表 |
| | | finishedOperateLogMapper.updateFinishedOperateLogState(finishedOperateLog,"已作废"); |
| | | if(existFinishedGoodsInventory.getQuantityAvailable()>finishedOperateLog.getCancelAvailable() |
| | | && finishedOperateLog.getQuantity()>finishedOperateLog.getCancelAvailable()){ |
| | | |
| | | Order order=orderMapper.selectOne(new LambdaQueryWrapper<Order>().eq(Order::getOrderId,finishedOperateLog.getOrderId())); |
| | | OrderDetail orderDetail=orderDetailMapper.selectOne(new LambdaQueryWrapper<OrderDetail>() |
| | | .eq(OrderDetail::getOrderId,finishedOperateLog.getOrderId()) |
| | | .eq(OrderDetail::getOrderNumber,finishedOperateLog.getOperationNumber()) |
| | | ); |
| | | if(order != null && orderDetail != null){ |
| | | Integer calculateType=order.getCalculateType(); |
| | | double deliveryDetailMoney = 0.0; |
| | | double deliveryDetailArea = 0.0; |
| | | |
| | | BigDecimal getComputeArea= BigDecimal.valueOf(orderDetail.getComputeArea()); |
| | | BigDecimal getQuantity= BigDecimal.valueOf(finishedOperateLog.getCancelAvailable()); |
| | | BigDecimal getPrice= BigDecimal.valueOf(orderDetail.getPrice()); |
| | | BigDecimal getWidth= BigDecimal.valueOf(orderDetail.getWidth()); |
| | | BigDecimal getHeight= BigDecimal.valueOf(orderDetail.getHeight()); |
| | | BigDecimal singlePieceArea =getComputeArea.multiply(getQuantity).setScale(2, RoundingMode.HALF_UP) |
| | | .multiply(getPrice).setScale(2, RoundingMode.HALF_UP); |
| | | //根据订单计算方式进行金额计算 |
| | | if (calculateType==1){ |
| | | deliveryDetailMoney=singlePieceArea.doubleValue(); |
| | | deliveryDetailArea=getComputeArea.multiply(getQuantity).doubleValue(); |
| | | |
| | | }else if (calculateType==2){ |
| | | //判断实际单片面积跟结算单片面积是否相等 结算总面积跟实际总面积是否相等 |
| | | if(Objects.equals(orderDetail.getArea(), orderDetail.getComputeArea())&&Objects.equals(orderDetail.getGrossArea(), orderDetail.getComputeGrossArea())){ |
| | | deliveryDetailMoney=getWidth.multiply(getHeight).multiply(getQuantity).divide(BigDecimal.valueOf(1000000), 2, RoundingMode.HALF_UP) |
| | | .multiply(getPrice).setScale(2, RoundingMode.HALF_UP).doubleValue(); |
| | | deliveryDetailArea=getWidth.multiply(getHeight).multiply(getQuantity).divide(BigDecimal.valueOf(1000000), 2, RoundingMode.HALF_UP).doubleValue(); |
| | | }else{ |
| | | deliveryDetailMoney=singlePieceArea.doubleValue(); |
| | | deliveryDetailArea=getComputeArea.multiply(getQuantity).doubleValue(); |
| | | } |
| | | }else if (calculateType==3){ |
| | | deliveryDetailMoney=getQuantity.multiply(getPrice).setScale(2, RoundingMode.HALF_UP).doubleValue(); |
| | | deliveryDetailArea=getComputeArea.multiply(getQuantity).doubleValue(); |
| | | |
| | | }else if (calculateType==4){ |
| | | //判断实际单片面积跟结算单片面积是否相等 结算总面积跟实际总面积是否相等 |
| | | if(Objects.equals(orderDetail.getArea(), orderDetail.getComputeArea())&&Objects.equals(orderDetail.getGrossArea(), orderDetail.getComputeGrossArea())){ |
| | | deliveryDetailMoney=getWidth.multiply(getHeight).multiply(getQuantity).multiply(getPrice). |
| | | divide(BigDecimal.valueOf(1000000), 2, RoundingMode.HALF_UP).doubleValue(); |
| | | deliveryDetailArea=getWidth.multiply(getHeight).multiply(getQuantity).divide(BigDecimal.valueOf(1000000), 2, RoundingMode.HALF_UP).doubleValue(); |
| | | }else{ |
| | | deliveryDetailMoney=getComputeArea.multiply(getQuantity).multiply(getPrice).setScale(2, RoundingMode.HALF_UP).doubleValue(); |
| | | deliveryDetailArea=getComputeArea.multiply(getQuantity).doubleValue(); |
| | | } |
| | | } |
| | | |
| | | finishedOperateLogMapper.updateFinishedOperateLogQuantity(finishedOperateLog,deliveryDetailMoney,deliveryDetailArea); |
| | | }else{ |
| | | return "false3"; |
| | | } |
| | | |
| | | |
| | | |
| | | }else{ |
| | | finishedOperateLogMapper.updateFinishedOperateLogState(finishedOperateLog,"已作废"); |
| | | } |
| | | //修改库存表入库数量 |
| | | finishedGoodsInventoryMapper.updateInventoryOut(finishedOperateLog); |
| | | if(finishedOperateLog.getProcessId()!=null){ |
| | |
| | | } |
| | | |
| | | //修改订单明细表入库数量 |
| | | finishedGoodsInventoryMapper.updateOutOrderNumberConut(finishedOperateLog.getOrderId(),finishedOperateLog.getOperationNumber(),finishedOperateLog.getQuantity()); |
| | | finishedGoodsInventoryMapper.updateOutOrderNumberConut(finishedOperateLog.getOrderId(),finishedOperateLog.getOperationNumber(),finishedOperateLog.getCancelAvailable()); |
| | | //判断订单是否全部入库 |
| | | if (Objects.equals(ordersum, ordernumbersum)) { |
| | | //修改订单表入库状态 |
| | |
| | | map.put("data", list); |
| | | return map; |
| | | } |
| | | |
| | | |
| | | public Map<String, Object> appFinishedGoodsInventoryList() { |
| | | Map<String, Object> map = new HashMap<>(); |
| | | Map<String, Object> totalSum = new HashMap<>(); |
| | | Integer inventory = 0; |
| | | Integer quantityAvailable = 0; |
| | | Double area = 0.00; |
| | | Double computeGrossArea = 0.00; |
| | | |
| | | List<FinishedGoodsInventory> finishedGoodsInventoryList=finishedGoodsInventoryMapper.getFinishedGoodsInventoryList(); |
| | | if(!finishedGoodsInventoryList.isEmpty()){ |
| | | for(FinishedGoodsInventory finishedGoodsInventory:finishedGoodsInventoryList){ |
| | | inventory += finishedGoodsInventory.getInventory(); |
| | | quantityAvailable += finishedGoodsInventory.getQuantityAvailable(); |
| | | area += finishedGoodsInventory.getArea(); |
| | | computeGrossArea+=finishedGoodsInventory.getComputeGrossArea(); |
| | | } |
| | | DecimalFormat df = new DecimalFormat("#.00"); |
| | | totalSum.put("inventory",inventory); |
| | | totalSum.put("quantityAvailable",quantityAvailable); |
| | | totalSum.put("area", df.format(area)); |
| | | totalSum.put("computeGrossArea", df.format(computeGrossArea)); |
| | | |
| | | map.put("data", finishedGoodsInventoryList); |
| | | map.put("total", totalSum); |
| | | } |
| | | |
| | | return map; |
| | | } |
| | | } |
| | |
| | | |
| | | <update id="updateflowcardOut"> |
| | | update pp.flow_card |
| | | set received_quantity=received_quantity-${finishedOperateLog.quantity},storage_time=now() |
| | | set received_quantity=received_quantity-${finishedOperateLog.cancelAvailable},storage_time=now() |
| | | where order_number=#{finishedOperateLog.operationNumber} and process_id=#{finishedOperateLog.processId} and order_id=#{finishedOperateLog.orderId} |
| | | </update> |
| | | |
| | |
| | | |
| | | <update id="updateInventoryOut"> |
| | | update mm.finished_goods_inventory |
| | | set inventory=inventory-${finishedOperateLog.quantity},quantity_available=quantity_available-${finishedOperateLog.quantity}, |
| | | set inventory=inventory-${finishedOperateLog.cancelAvailable},quantity_available=quantity_available-${finishedOperateLog.cancelAvailable}, |
| | | update_time=now(),area=actual_signal_area*quantity_available,compute_gross_area=compute_area*quantity_available |
| | | where order_number=#{finishedOperateLog.operationNumber} and order_id=#{finishedOperateLog.orderId} |
| | | <if test="finishedOperateLog.remarks != null and finishedOperateLog.remarks != ''"> |
| | |
| | | where o.create_time < DATE_SUB(CURDATE(), INTERVAL 6 MONTH) |
| | | and o.delivery=2 and fgi.inventory=0 |
| | | </delete> |
| | | |
| | | |
| | | |
| | | <select id="getFinishedGoodsInventoryList" resultMap="selectFinishedGoodsInventory"> |
| | | select |
| | | fgi.id, |
| | | fgi.process_id, |
| | | od.order_number, |
| | | o.order_id, |
| | | o.project, |
| | | o.order_type, |
| | | o.customer_id, |
| | | o.customer_name, |
| | | o.batch, |
| | | o.salesman, |
| | | od.product_name, |
| | | od.product_id, |
| | | od.width, |
| | | od.height, |
| | | od.building_number, |
| | | fgi.inventory, |
| | | fgi.quantity_available, |
| | | fgi.actual_signal_area, |
| | | fgi.area, |
| | | fgi.warehouse_number, |
| | | fgi.storage_region, |
| | | fgi.`status`, |
| | | fgi.update_time, |
| | | fgi.enter_storage_time, |
| | | fgi.end_time, |
| | | fgi.remark, |
| | | fgi.box_no, |
| | | fgi.compute_area, |
| | | fgi.compute_gross_area, |
| | | round(fgi.area*p.total_thickness*2.5/1000,5) as weight |
| | | from finished_goods_inventory fgi |
| | | left join sd.order_detail od on fgi.order_id = od.order_id and fgi.order_number = od.order_number |
| | | left join sd.`order` o on fgi.order_id = o.order_id |
| | | left join sd.product p on p.id=od.product_id |
| | | where fgi.status = 0 and fgi.quantity_available>0 and o.create_order>0 |
| | | order by fgi.update_time desc; |
| | | </select> |
| | | </mapper> |
| | |
| | | fol.money, |
| | | o.customer_name, |
| | | o.project, |
| | | od.price |
| | | od.price, |
| | | CASE |
| | | WHEN #{type} = '入库' THEN |
| | | if(fgi.quantity_available>fol.quantity,fol.quantity,fgi.quantity_available) |
| | | ELSE |
| | | 0 |
| | | END AS quantity_available, |
| | | CASE |
| | | WHEN #{type} = '入库' THEN |
| | | if(fgi.quantity_available>fol.quantity,fol.quantity,fgi.quantity_available) |
| | | ELSE |
| | | 0 |
| | | END AS cancelAvailable |
| | | from (select * |
| | | from mm.finished_operate_log aa where aa.operate_type = #{type} and 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 mm.finished_goods_inventory fgi on fgi.order_id = fol.order_id and fol.operation_number = fgi.order_number |
| | | left join sd.`order` o on o.order_id=fol.order_id |
| | | <where> |
| | | date(fol.operate_time)>=#{startDate} and date(fol.operate_time) <= #{endDate} |
| | |
| | | from (select * |
| | | from mm.finished_operate_log aa where aa.operate_type = #{type} and 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 mm.finished_goods_inventory fgi on fgi.order_id = fol.order_id and fol.operation_number = fgi.order_number |
| | | left join sd.`order` o on o.order_id=fol.order_id |
| | | <where> |
| | | date(fol.operate_time)>=#{startDate} and date(fol.operate_time) <= #{endDate} |
| | |
| | | update mm.finished_operate_log set status=#{type} where id=#{finishedOperateLog.id}; |
| | | </update> |
| | | |
| | | <update id="updateFinishedOperateLogQuantity"> |
| | | update mm.finished_operate_log set quantity=quantity-#{finishedOperateLog.cancelAvailable}, |
| | | area=area-#{deliveryDetailArea},money=money-#{deliveryDetailMoney} where id=#{finishedOperateLog.id}; |
| | | </update> |
| | | |
| | | <select id="getSelectOperateRecord" resultMap="selectFinishedGoodsInventory"> |
| | | select fol.id, |
| | | fol.operation_order_number, |