于杰
2025-11-04 7cf8f8fc1abca63423c1fb4618363f8a9d283f9d
Merge remote-tracking branch 'origin/master'
8个文件已修改
256 ■■■■■ 已修改文件
north-glass-erp/northglass-erp/src/views/mm/productStock/StorageRecord.vue 63 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/src/main/java/com/example/erp/controller/AppController.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/src/main/java/com/example/erp/entity/mm/FinishedOperateLog.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/src/main/java/com/example/erp/mapper/mm/FinishedGoodsInventoryMapper.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/src/main/java/com/example/erp/mapper/mm/FinishedOperateLogMapper.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/src/main/java/com/example/erp/service/mm/FinishedGoodsInventoryService.java 103 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/src/main/resources/mapper/mm/FinishedGoodsInventory.xml 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/src/main/resources/mapper/mm/FinishedOperateLog.xml 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/views/mm/productStock/StorageRecord.vue
@@ -78,6 +78,11 @@
    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
@@ -119,6 +124,11 @@
  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
@@ -139,6 +149,11 @@
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
@@ -262,7 +277,7 @@
})
const gridEvents = {
  toolbarButtonClick ({ code }) {
  async toolbarButtonClick({code}) {
    const $grid = xGrid.value
    if ($grid) {
      switch (code) {
@@ -277,30 +292,37 @@
              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
            })
          }
@@ -330,6 +352,22 @@
  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>
@@ -358,6 +396,7 @@
          v-bind="gridOptions"
          v-on="gridEvents"
          :checkbox-config="checkBoxConfig"
          :edit-rules="validRules"
      >
north-glass-erp/src/main/java/com/example/erp/controller/AppController.java
@@ -2,6 +2,7 @@
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;
@@ -24,6 +25,7 @@
    private final OrderService orderService;
    private final DeliveryService deliveryService;
    private final MaterialInventoryService materialInventoryService;
    private final FinishedGoodsInventoryService finishedGoodsInventoryService;
    @ApiOperation("订单报表")
    @PostMapping("/getOrderList")
@@ -42,4 +44,11 @@
    public Result getOriginalGlassList() {
        return Result.success(materialInventoryService.appGetStockList());
    }
    @ApiOperation("成品库存报表")
    @PostMapping("/getFinishedGoodsInventoryList")
    public Result getFinishedGoodsInventoryList() {
        return Result.success(finishedGoodsInventoryService.appFinishedGoodsInventoryList());
    }
}
north-glass-erp/src/main/java/com/example/erp/entity/mm/FinishedOperateLog.java
@@ -1,6 +1,7 @@
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;
@@ -38,6 +39,14 @@
    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;
north-glass-erp/src/main/java/com/example/erp/mapper/mm/FinishedGoodsInventoryMapper.java
@@ -160,6 +160,8 @@
    List<Map<String, Object>> getPrintDetail(String orderId, String boxNo, Integer productId, String thickness);
    Boolean deleteFinishedGoodsInventoryDate();
    List<FinishedGoodsInventory> getFinishedGoodsInventoryList();
}
north-glass-erp/src/main/java/com/example/erp/mapper/mm/FinishedOperateLogMapper.java
@@ -62,6 +62,9 @@
                                           @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);
north-glass-erp/src/main/java/com/example/erp/service/mm/FinishedGoodsInventoryService.java
@@ -10,6 +10,7 @@
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;
@@ -32,6 +33,7 @@
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;
@@ -1025,15 +1027,74 @@
                                .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){
@@ -1042,7 +1103,7 @@
                    }
                    //修改订单明细表入库数量
                    finishedGoodsInventoryMapper.updateOutOrderNumberConut(finishedOperateLog.getOrderId(),finishedOperateLog.getOperationNumber(),finishedOperateLog.getQuantity());
                    finishedGoodsInventoryMapper.updateOutOrderNumberConut(finishedOperateLog.getOrderId(),finishedOperateLog.getOperationNumber(),finishedOperateLog.getCancelAvailable());
                    //判断订单是否全部入库
                    if (Objects.equals(ordersum, ordernumbersum)) {
                        //修改订单表入库状态
@@ -1274,4 +1335,34 @@
        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;
    }
}
north-glass-erp/src/main/resources/mapper/mm/FinishedGoodsInventory.xml
@@ -555,7 +555,7 @@
    <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>
@@ -584,7 +584,7 @@
    <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 != ''">
@@ -1250,4 +1250,46 @@
               where o.create_time &lt; 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>
north-glass-erp/src/main/resources/mapper/mm/FinishedOperateLog.xml
@@ -64,10 +64,23 @@
        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) &lt;= #{endDate}
@@ -145,6 +158,7 @@
        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) &lt;= #{endDate}
@@ -223,6 +237,11 @@
        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,