39个文件已修改
3个文件已添加
926 ■■■■ 已修改文件
north-glass-erp/northglass-erp/src/assets/main.css 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/components/pp/PrintCustomLabelProject.vue 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/components/pp/PrintCustomLabelTwo.vue 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/components/pp/PrintProcess.vue 16 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/components/sd/order/PrintSheet4.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/lang/ar.js 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/lang/en.js 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/lang/kr.js 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/lang/ru.js 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/lang/zh.js 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/layout/MainErpView.vue 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/router/index.js 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/stores/sd/companySet/上海北玻.js 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/stores/sd/companySet/天津北玻.js 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/stores/sd/companySet/常州吉利.js 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/stores/sd/companySet/新疆恒鑫.js 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/stores/sd/companySet/洛阳北玻.js 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/stores/sd/companySet/温州巨星.js 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/stores/sd/companySet/金华天成.js 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/stores/sd/order/orderInfo.js 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/views/LoginView.vue 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/views/pp/reportingWorks/AddReportingWork.vue 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/views/sd/delivery/CreateDelivery.vue 117 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/views/sd/delivery/SelectDelivery.vue 88 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/views/sd/delivery/SelectOrderList.vue 123 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/views/sd/order/CreateOrder.vue 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/views/system/userLog/UserListLog.vue 235 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/views/system/userLog/UserLog.vue 61 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/src/main/java/com/example/erp/controller/AppController.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/src/main/java/com/example/erp/controller/sd/DeliveryController.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/src/main/java/com/example/erp/controller/userInfo/UserController.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/src/main/java/com/example/erp/dto/sd/DeliverySearchDTO.java 74 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/src/main/java/com/example/erp/entity/sd/Order.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/src/main/java/com/example/erp/mapper/sd/DeliveryMapper.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/src/main/java/com/example/erp/mapper/userInfo/UserMapper.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/src/main/java/com/example/erp/service/sd/DeliveryService.java 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/src/main/java/com/example/erp/service/sd/OrderService.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/src/main/java/com/example/erp/service/userInfo/UserService.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/src/main/resources/mapper/pp/FolwCard.xml 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/src/main/resources/mapper/sd/DeliveryDetailMapper.xml 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/src/main/resources/mapper/sd/DeliveryMapper.xml 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/src/main/resources/mapper/userInfo/User.xml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/assets/main.css
@@ -7,8 +7,8 @@
  font-weight: normal;
  height: 100%;
  width: 100%;
  /*min-width: 1536px;
  min-height: 730px;*/
  min-width: 1536px;
  min-height: 730px;
}
@media (max-width: 500px) {
north-glass-erp/northglass-erp/src/components/pp/PrintCustomLabelProject.vue
@@ -79,7 +79,6 @@
                  props.lastList.push(list.value[i].data[j])
            }
          }
          console.log(props)
        } else {
          ElMessage.warning(res.msg)
          router.push("/login")
north-glass-erp/northglass-erp/src/components/pp/PrintCustomLabelTwo.vue
@@ -110,7 +110,6 @@
              }
            }
          }
          console.log(props)
        } else {
          ElMessage.warning(res.msg)
        }
north-glass-erp/northglass-erp/src/components/pp/PrintProcess.vue
@@ -168,7 +168,17 @@
      //每个序号面积
      collection.total_area = parseFloat((collection.width * collection.height * collection.quantity / 1000000).toFixed(2))
      totalArea = add(totalArea, collection.total_area)
      totalWeight += collection.width * collection.height * collection.quantity / 1000000 * collection.separation * 2.5 * 1;
      //根据有几层计算重量
      for (let j = 0; j < produceList.value[i].detail.length; j++) {
        if (produceList.value[i].detail[j].technologyNumber.length>1){
          totalWeight += collection.weight * collection.quantity  * 1;
        }else {
          totalWeight += collection.width * collection.height * collection.quantity / 1000000 * collection.separation * 2.5 * 1;
        }
      }
      //每个序号周长
      collection.perimeter = parseFloat(((collection.width * 2 + collection.height * 2) * collection.quantity / 1000).toFixed(3))
    });
@@ -359,7 +369,9 @@
      <td class="tdNowrap">单片名称:</td>
      <td colspan="3">{{ itemTr.glass_child }}</td>
      <td class="tdNowrap">产品名称:</td>
      <td :colspan="2+item.processList.length*2">{{ itemTr.product_name }}</td>
      <td v-if="!company.processFontSize" :colspan="2+item.processList.length*2">{{ itemTr.product_name }}</td>
      <td v-else :colspan="2+item.processList.length*2" style="font-size: 18px;">{{ itemTr.product_name }}</td>
    </tr>
    <tr>
      <td rowspan='2'>序号</td>
north-glass-erp/northglass-erp/src/components/sd/order/PrintSheet4.vue
@@ -156,9 +156,9 @@
      </tr>
      <tr class="title-s">
        <th colspan="2" style="width: 30%;text-align: left;"><span>{{data.order.orderType}}&nbsp;总重量:{{ grossNum.weight }}</span></th>
        <th colspan="2" style="width: 30%;text-align: left;"><span>总重量:{{ grossNum.weight }}</span></th>
        <th colspan="5" style="width: 40%;">
          <h3 >生产任务单(成品)</h3>
          <h3 >生产任务单({{data.order.orderType}})</h3>
        </th>
        <th colspan="2" style="width: 30%;">订单编号:<span>{{ data.order.orderId }}</span>
          <span v-if="company.companyName==='常州市吉利玻璃有限公司'&& data.order.batch!==''">(原{{ data.order.batch }})</span>
north-glass-erp/northglass-erp/src/lang/ar.js
@@ -1333,7 +1333,8 @@
        userPassWord :'تغيير ÙƒÙ„مة Ø§Ù„مرور',
        glassPrice:'玻璃价格',
        glassOptimize:'玻璃优化',
        finishedGlassShelf:'成品料架'
        finishedGlassShelf:'成品料架',
        userLog:'登录日志'
    },
    glassPrice:{
north-glass-erp/northglass-erp/src/lang/en.js
@@ -1333,7 +1333,8 @@
        userPassWord :'User Pass Word',
        glassPrice:'Glass Price',
        glassOptimize:'玻璃优化',
        finishedGlassShelf:'成品料架'
        finishedGlassShelf:'成品料架',
        userLog:'登录日志'
    },
    glassPrice:{
north-glass-erp/northglass-erp/src/lang/kr.js
@@ -1334,7 +1334,8 @@
        userPassWord :'비밀번호 ë³€ê²½',
        glassPrice:'유리 ê°€ê²©',
        glassOptimize:'유리 ìµœì í™”',
        finishedGlassShelf:'成品料架'
        finishedGlassShelf:'成品料架',
        userLog:'登录日志'
    },
    glassPrice:{
north-glass-erp/northglass-erp/src/lang/ru.js
@@ -1334,7 +1334,8 @@
        userPassWord :'Изменить Ð¿Ð°Ñ€Ð¾Ð»ÑŒ',
        glassPrice:'Цена ÑÑ‚екла.',
        glassOptimize:'玻璃优化',
        finishedGlassShelf:'成品料架'
        finishedGlassShelf:'成品料架',
        userLog:'登录日志'
    },
    glassPrice:{
north-glass-erp/northglass-erp/src/lang/zh.js
@@ -1335,7 +1335,8 @@
        userPassWord :'修改密码',
        glassPrice:'玻璃价格',
        glassOptimize:'玻璃优化',
        finishedGlassShelf:'成品料架'
        finishedGlassShelf:'成品料架',
        userLog:'登录日志'
    },
    glassPrice:{
north-glass-erp/northglass-erp/src/layout/MainErpView.vue
@@ -122,17 +122,14 @@
</script>
<template>
  <div>
  <div style="height:100%;width:100%">
    <el-container id="el-container1">
      <el-header >
        <div style="height: 100%;width: 100%;display: flex">
          <img src="../assets/northGlass.ico" alt="" style="max-width: 100%;max-height: 100%">
          <h3 style="margin: 1rem  ;font-weight: bold;width: 70vw;"> {{$t('main.titleFirst') + user + $t('main.titleLast')}}</h3>
          <span style="height: 70%;width: 78vw;margin-top: 1.5rem;" >
<!--            <el-button   class="sys-quit" @click="quit"  type="info" round>-->
          <h3 style="margin: 1rem  ;font-weight: bold;width: 95%;"> {{$t('main.titleFirst') + user + $t('main.titleLast')}}</h3>
          <span style="height: 70%;width: 10%;margin-top: 1.5rem;" >
              <el-icon @click="quit"  style="float: right;margin-right: 1rem" size="large" ><SwitchButton  size=""/></el-icon>
<!--            </el-button>-->
          </span>
        </div>
      </el-header>
@@ -219,12 +216,12 @@
<style scoped>
#el-container1{
  height: 100vh;
  width: 100vw;
  height: 100%;
  width: 100%;
}
#el-container2{
  height:calc(100% - 60px);
  width: 100vw;
  width: 100%;
}
*{
north-glass-erp/northglass-erp/src/router/index.js
@@ -83,6 +83,23 @@
            }
          ]
        },
        {
          path:'userLog',
          name: 'userLog',
          component: () => import('../views/system/userLog/UserLog.vue'),
          children:[
            {
              path: 'userListLog',
              name: 'userListLog',
              component: () => import('../views/system/userLog/UserListLog.vue'),
            },
            {
              name:'userLog',
              path: '',
              redirect:'/main/userLog/userListLog'
            }
          ]
        },
        {
          path:'glassPrice',
north-glass-erp/northglass-erp/src/stores/sd/companySet/ÉϺ£±±²£.js
@@ -23,6 +23,8 @@
            msg:'basicData.msg.range99999Dec2'
        },
        orderIdType:'day',//后端生成订单号类型,day:每天生成,month:每月生成,year:每年生成
        orderIdTypeLetter:'NG',//订单号前面字母
        orderIdTypeMantissa:2,//订单号尾数保留位数  orderIdTypeLetter长度+orderIdTypeMantissa =4
        deliveryIdType:'day',
        deliveryDate:15,//订单创建送货日期 å¤©æ´¥7天,常州7天,义乌15天,新疆15天
        columnName:'图号',
north-glass-erp/northglass-erp/src/stores/sd/companySet/Ìì½ò±±²£.js
@@ -23,6 +23,8 @@
            msg:'basicData.msg.range99999Dec2'
        },
        orderIdType:'year',//后端生成订单号类型,day:每天生成,month:每月生成,year:每年生成
        orderIdTypeLetter:'NG',//订单号前面字母
        orderIdTypeMantissa:2,//订单号尾数保留位数  orderIdTypeLetter长度+orderIdTypeMantissa =4
        deliveryIdType:'day',//后端生成发货单号类型,day:每天生成,month:每月生成
        deliveryDate:7,//订单创建送货日期 å¤©æ´¥7天,常州7天,义乌15天,新疆15天
        columnName:'图号',//打印生产单时需要显示的列名,没有为空
north-glass-erp/northglass-erp/src/stores/sd/companySet/³£ÖݼªÀû.js
@@ -23,6 +23,8 @@
            msg:'basicData.msg.range9999Dec'
        },
        orderIdType:'month',//后端生成订单号类型,day:每天生成,month:每月生成
        orderIdTypeLetter:'NG',//订单号前面字母
        orderIdTypeMantissa:2,//订单号尾数保留位数  orderIdTypeLetter长度+orderIdTypeMantissa =4
        deliveryIdType:'month',//后端生成发货单号类型,day:每天生成,month:每月生成
        deliveryDate:7,//订单创建送货日期 å¤©æ´¥7天,常州7天,义乌15天,新疆15天
        columnName:'异形参数',//打印生产单时需要显示的列名,没有为空
north-glass-erp/northglass-erp/src/stores/sd/companySet/н®ºãöÎ.js
@@ -23,6 +23,8 @@
            msg:'basicData.msg.range99999Dec2'
        },
        orderIdType:'year',//后端生成订单号类型,day:每天生成,month:每月生成,year:按年生成
        orderIdTypeLetter:'NG',//订单号前面字母
        orderIdTypeMantissa:2,//订单号尾数保留位数  orderIdTypeLetter长度+orderIdTypeMantissa =4
        deliveryIdType:'day',//后端生成发货单号类型,day:每天生成,month:每月生成
        deliveryDate:15,//订单创建送货日期 å¤©æ´¥7天,常州7天,义乌15天,新疆15天
        columnName:'图号',//打印生产单时需要显示的列名,没有为空
north-glass-erp/northglass-erp/src/stores/sd/companySet/ÂåÑô±±²£.js
@@ -23,6 +23,8 @@
            msg:'basicData.msg.range99999Dec2'
        },
        orderIdType:'day',//后端生成订单号类型,day:每天生成,month:每月生成,year:每年生成
        orderIdTypeLetter:'NG',//订单号前面字母
        orderIdTypeMantissa:2,//订单号尾数保留位数  orderIdTypeLetter长度+orderIdTypeMantissa =4
        deliveryIdType:'day',
        deliveryDate:15,//订单创建送货日期 å¤©æ´¥7天,常州7天,义乌15天,新疆15天
        columnName:'图号',
north-glass-erp/northglass-erp/src/stores/sd/companySet/ÎÂÖݾÞÐÇ.js
@@ -23,6 +23,8 @@
            msg:'basicData.msg.range99999Dec2'
        },
        orderIdType:'day',//后端生成订单号类型,day:每天生成,month:每月生成,year:每年生成
        orderIdTypeLetter:'NG',//订单号前面字母
        orderIdTypeMantissa:2,//订单号尾数保留位数  orderIdTypeLetter长度+orderIdTypeMantissa =4
        deliveryIdType:'day',//后端生成发货单号类型,day:每天生成,month:每月生成
        deliveryDate:15,//订单创建送货日期 å¤©æ´¥7天,常州7天,义乌15天,新疆15天
        columnName:'图号',//打印生产单时需要显示的列名,没有为空
north-glass-erp/northglass-erp/src/stores/sd/companySet/½ð»ªÌì³É.js
@@ -22,7 +22,9 @@
            //regexp:/^(0|[1-9][0-9]{0,3}([.][0-9]{1,2})?)$/,//正则0.00-9999.99
            msg:'basicData.msg.range99999Dec2'
        },
        orderIdType:'year',//后端生成订单号类型,day:每天生成,month:每月生成,year:每年生成
        orderIdType:'day',//后端生成订单号类型,day:每天生成,month:每月生成,year:每年生成
        orderIdTypeLetter:'R',//订单号前面字母
        orderIdTypeMantissa:3,//订单号尾数保留位数  orderIdTypeLetter长度+orderIdTypeMantissa =4
        deliveryIdType:'day',//后端生成发货单号类型,day:每天生成,month:每月生成
        deliveryDate:15,//订单创建送货日期 å¤©æ´¥7天,常州7天,义乌15天,新疆15天
        columnName:'图号',//打印生产单时需要显示的列名,没有为空
north-glass-erp/northglass-erp/src/stores/sd/order/orderInfo.js
@@ -52,6 +52,11 @@
            }
        },
        searchDeliverFilter:{
            list:ref([]),
            data:{}
        },
        projectNo:ref(),
        optimizeData:{
            optimalResults:'',
@@ -117,6 +122,10 @@
                    }
                }
            }
            this.searchDeliverFilter={
                list:[],
                data:{}
            }
            this.projectNo=null
            this.optimizeData={
                optimalResults:null,
north-glass-erp/northglass-erp/src/views/LoginView.vue
@@ -192,11 +192,13 @@
</template>
<style scoped>
.mainDiv1{
//background-color: #1890FF;
  //overflow: hidden;
  width: 100%;
  height: 100%;
  width: 100vw;
  height: 100vh;
  display: grid;
  place-items: center; /* åŒæ—¶æ°´å¹³å’Œåž‚直居中 */
}
north-glass-erp/northglass-erp/src/views/pp/reportingWorks/AddReportingWork.vue
@@ -899,7 +899,10 @@
    }
  }
}
const brokenGridKey = ref(0)
const openedBrokenTable = async () => {
  brokenGridKey.value++
  await nextTick()
  console.log('breakageType:', titleSelectJson.value.breakageType)
  console.log('breakageReason:', titleSelectJson.value.breakageReason)
@@ -1893,7 +1896,7 @@
          +brokenRow.glass_child+'.'+brokenRow.order_number+'.'+brokenRow.technology_number"
          style="width: 80%;height:75% ">
        <vxe-grid
            :key="brokenGridKey"
            height="400px"
            ref="brokenGrid"
            class="mytable-scrollbar"
north-glass-erp/northglass-erp/src/views/sd/delivery/CreateDelivery.vue
@@ -19,6 +19,8 @@
import {multiply} from "@/utils/decimal";
import MaterialAddition from "@/views/mm/ingredientStock/MaterialAddition.vue";
import {copyTableCellValue} from "@/hook/copyTableCellValue";
import SelectOrderList from "@/views/sd/delivery/SelectOrderList.vue";
import { ElDialog } from "element-plus";
//语言获取
const { t } = useI18n()
@@ -35,6 +37,19 @@
let otherMoneyVisible = ref(false)
let otherMoney = ref(null)
const dialogSelectOrderVisible = ref(false); // æŽ§åˆ¶å¼¹çª—显示
const currentOrderIds = ref([]); // å·²æœ‰çš„订单ID,用于排除
// åˆå§‹åŒ–已选订单ID(在onMounted中调用)
const initCurrentOrderIds = () => {
  if (produceList && produceList.length > 0) {
    const orderIds = produceList.map(item => item.orderId);
    currentOrderIds.value = [...new Set(orderIds)];
  }else {
    currentOrderIds.value = [];
  }
};
const hasDecimal=(value)=>{
  const regex=/\./ // å®šä¹‰æ­£åˆ™è¡¨è¾¾å¼ï¼ŒæŸ¥æ‰¾å°æ•°ç‚¹
@@ -209,6 +224,7 @@
        //禁用按钮
        gridOptions.toolbarConfig.buttons[2].disabled  = true
        gridOptions.toolbarConfig.buttons[3].disabled = true
        //gridOptions.toolbarConfig.buttons[4].disabled = false
        //显示复选框
        xGrid.value.showColumn("select")
        gridOptions.loading=false
@@ -245,6 +261,7 @@
        if(titleUploadData.value.deliveryState!==0){
          gridOptions.toolbarConfig.buttons[2].disabled = true
          gridOptions.toolbarConfig.buttons[1].disabled = true
          //gridOptions.toolbarConfig.buttons[4].disabled = true
        }
        if(titleUploadData.value.deliveryState===0){
          gridOptions.toolbarConfig.buttons[3].disabled = true
@@ -370,6 +387,7 @@
      {'code': 'addToExamine', 'name': t('reportingWorks.saveAndReview'),status: 'primary',icon: 'vxe-icon-save'},
      {'code': 'toExamine', 'name': t('basicData.review'),status: 'primary'},
      {'code': 'CounterExamination', 'name': t('basicData.cancelReview'),status: 'primary'},
      //{'code': 'addOtherOrders','name': t('订单添加'),'status': 'primary'}
      //{'code': 'glassShelf', 'name': t('finishedGlassShelf.finishedGlassShelfEmit'),status: 'primary'}
    ],
    /*import: false,
@@ -616,6 +634,13 @@
          })
          break
        }
        case 'addOtherOrders': {
          // æ˜¾ç¤ºå¼¹çª—前更新已选订单ID
          initCurrentOrderIds();
          // æ˜¾ç¤ºå¼¹çª—
          dialogSelectOrderVisible.value = true;
          break;
        }
      }
    }
  },
@@ -826,7 +851,83 @@
};
// å¤„理从SelectOrderList选中的订单
const handleSelectedOrders = async (selectedOrders) => {
  if (!selectedOrders || selectedOrders.length === 0) return;
  // å…³é—­å¼¹çª—
  dialogSelectOrderVisible.value = false;
  // éªŒè¯é€‰ä¸­çš„订单是否符合条件
  const { customerId, project } = titleUploadData.value;
  const invalidOrders = selectedOrders.filter(order =>
      order.customerId !== parseInt(customerId) || order.project !== project
  );
  if (invalidOrders.length > 0) {
    ElMessage.warning(t('delivery.onlySameCustomerProject'));
    return;
  }
  try {
    // æ˜¾ç¤ºåŠ è½½çŠ¶æ€
    gridOptions.loading = true;
    // æ‰¹é‡æŸ¥è¯¢è®¢å•明细(按订单ID)
    const orderIds = selectedOrders.map(order => order.orderId).join('|');
    filterData.value.orderId=orderIds
    request.post("/delivery/getSelectShippingOrderDetails/1/100",filterData.value).then((res) => {
      if (res.code == 200) {
        // å¤„理返回的明细数据
        const orderDetails = res.data.data || [];
        //合并数据
        mergeData(orderDetails);
      } else {
        ElMessage.warning(res.msg || t('basicData.msg.data获取失败'));
      }
    })
  } catch (error) {
    ElMessage.error(t('basicData.msg.ServerConnectionError'));
    console.error('查询订单明细失败:', error);
  } finally {
    // å…³é—­åŠ è½½çŠ¶æ€
    gridOptions.loading = false;
  }
};
// åˆå¹¶æ•°æ®ï¼šåˆ¤æ–­orderId、orderNumber、boxNo是否相同,相同则累加数量,不同则新增
const mergeData = (newDataList) => {
  // å¤åˆ¶çŽ°æœ‰æ•°æ®ï¼ˆé¿å…ç›´æŽ¥ä¿®æ”¹å“åº”å¼æºæ•°æ®ï¼‰
  const currentList = [...produceList];
  newDataList.forEach(newItem => {
    // æå–新数据的关键比对字段
    const newOrderId = newItem.orderId;
    const newOrderNumber = newItem.orderNumber;
    const newBoxNo = newItem.finishedGoodsInventory?.boxNo || ''; // å¤„理可能的undefined
    // åœ¨çŽ°æœ‰æ•°æ®ä¸­æŸ¥æ‰¾åŒ¹é…é¡¹ï¼ˆä¸‰ä¸ªå­—æ®µå®Œå…¨ç›¸åŒï¼‰
    const matchedItem = currentList.find(item =>
        item.orderId === newOrderId &&
        item.orderNumber === newOrderNumber &&
        (item.finishedGoodsInventory?.boxNo || '') === newBoxNo
    );
    if (matchedItem) {
      // æ‰¾åˆ°åŒ¹é…é¡¹ï¼šç´¯åŠ æ•°é‡ï¼ˆç¡®ä¿æ˜¯æ•°å€¼ç±»åž‹ï¼‰
      matchedItem.deliveryDetail.quantity = (Number(matchedItem.deliveryDetail.quantity) || 0) +
          (Number(newItem.deliveryDetail.quantity) || 0);
    } else {
      // æœªæ‰¾åˆ°åŒ¹é…é¡¹ï¼šæ–°å¢žä¸€æ¡æ•°æ®
      currentList.push(newItem);
    }
  });
  // æ›´æ–°å“åº”式数据
  produceList = currentList;
  // åˆ·æ–°è¡¨æ ¼
  xGrid.value.reloadData(produceList);
};
</script>
@@ -997,6 +1098,22 @@
          @handle-result="handleChildResult2"
      />
    </el-dialog>
    <el-dialog
        v-model="dialogSelectOrderVisible"
        :title="t('订单添加')"
        style="width: 70%;height:75% "
        destroy-on-close
        :close-on-click-modal="false"
        :close-on-press-escape="false">
      <SelectOrderList
          style="width: 100%;height: 600px"
          :customer-id="titleUploadData.customerId"
          :project="titleUploadData.project"
          :exclude-order-ids="currentOrderIds"
          @select-orders="handleSelectedOrders"
      />
    </el-dialog>
  </div>
</template>
north-glass-erp/northglass-erp/src/views/sd/delivery/SelectDelivery.vue
@@ -1,6 +1,6 @@
<script setup>
import {Search} from "@element-plus/icons-vue";
import {reactive, ref} from "vue";
import {onMounted, reactive, ref} from "vue";
import {useRouter} from "vue-router"
import request from "@/utils/request"
import deepClone from "@/utils/deepClone"
@@ -92,6 +92,10 @@
//筛选条件,有外键需要先定义明细里面的数据
let filterData = ref({})
let sortData = ref({
  field:'id',
  order:null
})
let selectDate = ref(["",""])
@@ -103,29 +107,44 @@
  pageSize : 100
})
//第一次调用
request.post(`/delivery/getSelectShippingOrder/1/${total.pageSize}/${orderInfo.selectDeliveryDate}`,filterData.value).then((res) => {
  if(res.code==200){
    total.dataTotal = res.data.total.total*1
    total.pageTotal= res.data.total.pageTotal
    orderInfo.selectDeliveryDate = res.data.selectDate
    pageNum.value=1
    produceList = deepClone(res.data.data)
    if(company.companyName=='洛阳北方玻璃技术股份有限公司'){
      xGrid.value.menuConfig.body.options[0][2].visible=true
      xGrid.value.menuConfig.body.options[0][3].visible=true
      xGrid.value.menuConfig.body.options[0][4].visible=true
      xGrid.value.menuConfig.body.options[0][5].visible=true
    }
    xGrid.value.loadData(produceList)
    gridOptions.loading=false
  }else{
    ElMessage.warning(res.msg)
    router.push("/login")
  }
onMounted(async () => {
  filterData.value = orderInfo.searchDeliverFilter.data
  await getDeliveryList()
  orderInfo.searchDeliverFilter.list.forEach(item =>{
    xGrid.value.getColumnByField(item.field).filters = item.column.filters
  })
})
const getDeliveryList = async () => {
  //加载请求
  const config = {
    filter: filterData.value,
    sort: sortData.value
  }
  await request.post(`/delivery/getSelectShippingOrder/1/${total.pageSize}/${orderInfo.selectDeliveryDate}`,config).then((res) => {
    if(res.code==200){
      total.dataTotal = res.data.total.total*1
      total.pageTotal= res.data.total.pageTotal
      orderInfo.selectDeliveryDate = res.data.selectDate
      pageNum.value=1
      produceList = deepClone(res.data.data)
      if(company.companyName=='洛阳北方玻璃技术股份有限公司'){
        xGrid.value.menuConfig.body.options[0][2].visible=true
        xGrid.value.menuConfig.body.options[0][3].visible=true
        xGrid.value.menuConfig.body.options[0][4].visible=true
        xGrid.value.menuConfig.body.options[0][5].visible=true
      }
      xGrid.value.loadData(produceList)
      gridOptions.loading=false
    }else{
      ElMessage.warning(res.msg)
      router.push("/login")
    }
  })
}
//定义当前页数
@@ -150,7 +169,12 @@
  }else{
    filterData.value[column.property] = value
  }
  request.post(`/delivery/getSelectShippingOrder/1/${total.pageSize}/${orderInfo.selectDeliveryDate}`,filterData.value).then((res) => {
  const config = {
    filter: filterData.value,
    sort: sortData.value
  }
  request.post(`/delivery/getSelectShippingOrder/1/${total.pageSize}/${orderInfo.selectDeliveryDate}`,config).then((res) => {
    if(res.code==200){
      total.dataTotal = res.data.total.total*1
@@ -162,6 +186,9 @@
        xGrid.value.menuConfig.body.options[0][2].visible=true
        xGrid.value.menuConfig.body.options[0][3].visible=true
      }
      orderInfo.searchDeliverFilter.list = xGrid.value.getCheckedFilters()
      orderInfo.searchDeliverFilter.data = filterData.value
      gridOptions.loading=false
    }else{
      ElMessage.warning(res.msg)
@@ -172,7 +199,11 @@
const selectOrderList = ()=>{
  request.post(`/delivery/getSelectShippingOrder/${pageNum.value}/${total.pageSize}/${orderInfo.selectDeliveryDate}`,filterData.value).then((res) => {
  const config = {
    filter: filterData.value,
    sort: sortData.value
  }
  request.post(`/delivery/getSelectShippingOrder/${pageNum.value}/${total.pageSize}/${orderInfo.selectDeliveryDate}`,config).then((res) => {
    if(res.code==200){
      if (res.data.total!=null){
@@ -494,6 +525,10 @@
  },
  cellClick({ row }){
    rowClickIndex.value = row
  },
  sortChange ({ field, order }) {
    sortData.value = {field,order}
    selectOrderList()
  }
}
@@ -517,6 +552,9 @@
  filterConfig: {   //筛选配置项
    remote: true
  },
  sortConfig: {   //排序配置项
    remote: true//是否服务端排序
  },
  customConfig: {
    storage: true
  },
north-glass-erp/northglass-erp/src/views/sd/delivery/SelectOrderList.vue
@@ -1,7 +1,7 @@
<script setup>
import {Search} from "@element-plus/icons-vue"
import {useRouter} from "vue-router"
import {reactive, ref} from "vue";
import {onMounted, reactive, ref} from "vue";
import request from "@/utils/request"
import deepClone from "@/utils/deepClone"
import VXETable from "vxe-table";
@@ -18,6 +18,15 @@
const username = userStore.user.userName
const userid = userStore.user.userId
let produceList = ref([])
const props = defineProps({
  customerId: null,
  project: null,
  excludeOrderIds: null
})
const emit = defineEmits(['selectOrders'])
const getTableRow = (row,type) =>{
  switch (type) {
@@ -52,11 +61,6 @@
//筛选条件,有外键需要先定义明细里面的数据
let filterData = ref({
  finishedGoodsInventory:{
    quantityAvailable:'',
  },
})
let selectDate = ref(["",""])
@@ -68,23 +72,45 @@
})
//第一次调用
request.post(`/delivery/getSelectOrderInventory/1/${total.pageSize}/${orderInfo.selectOrderListDate}`,filterData.value).then((res) => {
  if(res.code==200){
    total.dataTotal = res.data.total.total*1
    total.pageTotal= res.data.total.pageTotal
    orderInfo.selectOrderListDate = res.data.selectDate
    pageNum.value=1
    produceList = deepClone(res.data.data)
    xGrid.value.loadData(produceList)
    gridOptions.loading=false
  }else{
    ElMessage.warning(res.msg)
    router.push("/login")
// ç¬¬ä¸€æ¬¡è°ƒç”¨ï¼Œä¿®æ”¹ä¸ºå¸¦ç­›é€‰æ¡ä»¶
const fetchOrders = async () => {
  await request.post(`/delivery/getSelectOrderInventory/${pageNum.value}/${total.pageSize}/${orderInfo.selectOrderListDate}`, filterData.value).then((res) => {
    if(res.code==200){
      total.dataTotal = res.data.total.total*1
      total.pageTotal= res.data.total.pageTotal
      orderInfo.selectOrderListDate = res.data.selectDate
      produceList = deepClone(res.data.data)
      xGrid.value.loadData(produceList)
      gridOptions.loading=false
    }else{
      ElMessage.warning(res.msg)
      router.push("/login")
    }
  })
}
onMounted(async () => {
  if (props.customerId !== undefined) {
    filterData.value.customerId = props.customerId
    filterData.value.project = props.project
    filterData.value.excludeOrderIds = props.excludeOrderIds
    gridOptions.toolbarConfig.buttons[0].visible = false
    await fetchOrders()
  } else {
    gridOptions.toolbarConfig.buttons[1].visible = false
    filterData.value = orderInfo.searchOrderFilter.data
    await fetchOrders()
    orderInfo.searchOrderFilter.list.forEach(item => {
      xGrid.value.getColumnByField(item.field).filters = item.column.filters
    })
  }
})
})
const changeFilterEvent = (event, option, $panel,) => {
  // æ‰‹åŠ¨è§¦å‘ç­›é€‰
@@ -104,6 +130,16 @@
  }else{
    filterData.value[column.property] = value
  }
  if(props.customerId!==undefined){
    filterData.value.customerId = props.customerId
    filterData.value.project = props.project
    filterData.value.excludeOrderIds = props.excludeOrderIds
    gridOptions.toolbarConfig.buttons[0].visible  = false
  }else{
    gridOptions.toolbarConfig.buttons[1].visible  = false
  }
  request.post(`/delivery/getSelectOrderInventory/1/${total.pageSize}/${orderInfo.selectOrderListDate}`,filterData.value).then((res) => {
    if(res.code==200){
@@ -113,6 +149,13 @@
      pageNum.value=1
      produceList = deepClone(res.data.data)
      xGrid.value.loadData(produceList)
      //不是弹窗界面
      if(props.customerId===undefined){
        orderInfo.searchOrderFilter.list = xGrid.value.getCheckedFilters()
        orderInfo.searchOrderFilter.data = filterData.value
      }
      gridOptions.loading=false
    }else{
      ElMessage.warning(res.msg)
@@ -142,7 +185,7 @@
const changeDate =  ()=>{
  pageNum.value=1
  selectOrderList()
  fetchOrders()
}
//页脚跳转
@@ -150,7 +193,7 @@
  total.pageTotal = pageSize
  pageNum.value=currentPage
  selectOrderList()
  fetchOrders()
}
@@ -201,7 +244,7 @@
    {field: 'customerId',width:120,  title: t('customer.customerNumber'),filters:[{ data: '' }],slots: { filter: 'num1_filter' }, sortable: true},
    {field: 'customerName',width:120,  title: t('customer.customerName'),filters:[{ data: '' }],slots: { filter: 'num1_filter' }, sortable: true},
    {field: 'quantity',width:120,  title: t('order.quantity'),filters:[{ data: '' }],slots: { filter: 'num1_filter' }, sortable: true},
    {field: 'finishedGoodsInventory.quantityAvailable',width:120,  title: t('delivery.availableStock'),filters:[{ data: '' }],slots: { filter: 'num1_filter' }, sortable: true},
    {field: 'finishedGoodsInventory.quantityAvailable',width:120,  title: t('delivery.availableStock'), sortable: true},
    {field: 'project',width:120,  title: t('order.project'),filters:[{ data: '' }],slots: { filter: 'num1_filter' }, sortable: true},
    {field: 'batch',width:120,  title: t('order.batch'),filters:[{ data: '' }],slots: { filter: 'num1_filter' }, sortable: true},
    {field: 'money',width:120,   title: t('order.money'),filters:[{ data: '' }],slots: { filter: 'num1_filter' }, sortable: true},
@@ -215,7 +258,8 @@
  ],//表头按钮
  toolbarConfig: {
    buttons: [
      {'code': 'add', 'name': t('delivery.delivery'),status: 'primary',icon: 'vxe-icon-add'}
      {'code': 'add', 'name': t('delivery.delivery'),status: 'primary',icon: 'vxe-icon-add'},
      {'code': 'update', 'name': t('delivery.delivery'),status: 'primary',icon: 'vxe-icon-add'}
    ],
    /*import: false,
   export: true,
@@ -282,6 +326,37 @@
          router.push({path: '/main/delivery/createDelivery', query: { orderId: order_id }})
          break
        }
        case 'update': {
          const selectRecords = $grid.getCheckboxRecords()
          if (selectRecords.length === 0) {
            ElMessage.warning(t('productStock.unselectedData'))
            return
          }
          // éªŒè¯æ‰€é€‰è®¢å•是否符合条件(虽然已筛选,但二次验证更安全)
          const customerIdArray = selectRecords.map(item => item.customerId)
          const projectArray = selectRecords.map(item => item.project?.trim() || '')
          if(!isAllEqual(customerIdArray)){
            ElMessage.warning(t('delivery.pleaseSelectTheSameCustomerOrder'))
            return
          }
          if(!isAllEqual(projectArray)){
            ElMessage.warning(t('delivery.pleaseSelectTheSameCustomerProject'))
            return
          }
          const simpleOrders = selectRecords.map(order => ({
            orderId: order.orderId,
            customerId: order.customerId,
            project: order.project,
            // å¯è¡¥å……其他需要的主订单字段
          }));
          // é€šè¿‡äº‹ä»¶è¿”回给父组件
          emit('select-orders', simpleOrders);
          break
        }
      }
    }
  }
north-glass-erp/northglass-erp/src/views/sd/order/CreateOrder.vue
@@ -401,7 +401,9 @@
              creator:userStore.user.userName,
              creatorId:userStore.user.userId,
              newOrderId:newOrderId.value,
              position:company.position
              position:company.position,
              orderIdTypeLetter:company.orderIdTypeLetter,
              orderIdTypeMantissa:company.orderIdTypeMantissa
            }
            const grossAreaList = $grid.getTableData().fullData.filter(
                item=>item.grossArea === 0
north-glass-erp/northglass-erp/src/views/system/userLog/UserListLog.vue
New file
@@ -0,0 +1,235 @@
<script setup>
import {onBeforeMount, onMounted, reactive, ref} from "vue"
import {changeFilterEvent,filterChanged} from "@/hook"
import request from "@/utils/request"
import {useRouter,useRoute} from "vue-router"
import {useI18n} from "vue-i18n"
import {ElMessage, ElMessageBox} from "element-plus"
import deepClone from "@/utils/deepClone";
const { t } = useI18n()
const router = useRouter()
const route = useRoute()
const dialogVisible = ref(false)
const dialogVisibleProcess = ref(false)
let roleList = ref([])
//工序
const processValue = ref()
let userRole= ref({
  userId:'',
  roles:[]
})
let processRow = ref({
  process: null,
  userId:null
})
let produceList = ref([])
const xGrid = ref()
const gridOptions = reactive({
  border:  "full",//表格加边框
  keepSource: true,//保持源数据
  align: 'center',//文字居中
  stripe:true,//斑马纹
  rowConfig: {isCurrent: true, isHover: true,height: 30},//鼠标移动或选择高亮
  id: 'userList',
  showFooter: false,//显示脚
  printConfig: {},
  importConfig: {},
  exportConfig: {},
  scrollY:{ enabled: true },//开启虚拟滚动
  showOverflow:true,
  columnConfig: {
    resizable: true,
    useKey: true
  },
  filterConfig: {   //筛选配置项
  },
  customConfig: {
    storage: true
  },
  editConfig: {
    trigger: 'click',
    mode: 'row',
    showStatus: true
  },
  //表头参数
  columns:[
    {type: 'seq', title: t('basicData.Number'), width: 80 ,fixed:"left"},
    {field: 'operator_id',width:120,  title: t('登录名'), sortable: true, filters:[{ data: '' }],slots: { filter: 'num1_filter' },filterMethod:filterChanged},
    {field: 'operator',width:120,  title: t('用户名'), sortable: true, filters:[{ data: '' }],slots: { filter: 'num1_filter' },filterMethod:filterChanged},
    {field: 'format_create_time',width:160,  title: t('登录时间'),sortable: true},
  ],
  //表头按钮
  toolbarConfig: {
    buttons: [
    ],
    zoom: true,
    custom: true
  },
})
onMounted(()=>{
  request.post('/user/getUserLog').then(res=>{
    if(res.code==200){
      produceList = deepClone(res.data.data)
      xGrid.value.loadData(produceList)
      gridOptions.loading=false
    }else{
      ElMessage.warning(res.msg)
      router.push("/login")
    }
  })
})
const getTableRow =  (row,type) => {
  switch (type) {
    case 'edit': {
      userRole.value.roles = []
      dialogVisible.value = true
      row.userRoleList.forEach(item=>{
        userRole.value.roles.push(item.roleId)
      })
      userRole.value.userId = row.id
      break
    }
    case 'delete': {
      request.post(`/userInfo/userDelete/${row.id}`).then((res) => {
        if(res.code==200 && res.data ===true){
          ElMessage.success(t('searchOrder.msgDeleteSuccess'))
          router.push({path:'/main/user/userList',query:{random:Math.random()}})
        }else{
          ElMessage.warning(t('searchOrder.msgDeleteFail'))
        }
      })
      break
    }
    case 'editProcess': {
      dialogVisibleProcess.value = true
      processRow.value.userId = row.id
      break
    }
  }
}
const handleClose = (done) => {
  userRole.value.roles = []
  done()
}
</script>
<template>
  <div  style="width: 100%;height: 100%">
    <div class="main-table">
      <vxe-grid
          height="100%"
          class="mytable-scrollbar"
          ref="xGrid"
          v-bind="gridOptions"
      >
        <template #filter="{ column, $panel }">
          <div>
            <div v-for="(option, index) in column.filters" :key="index">
              <input
                  type="type"
                  v-model="option.data"
                  @keyup.enter.native="$panel.confirmFilter()"
                  @input="changeFilterEvent($event, option, $panel)"/>
            </div>
          </div>
        </template>
        <template #button_slot="{ row }">
          <el-button @click="getTableRow(row,'edit')" link type="primary" size="small">{{ $t('user.setUpRoles') }}</el-button>
          <el-button @click="getTableRow(row,'editProcess')" link type="primary" size="small">{{ $t('user.setProcess') }}</el-button>
          <el-popconfirm @confirm="getTableRow(row,'delete')" :title="$t('searchOrder.deleteConfirm')">
            <template #reference>
              <el-button  link type="primary" size="small">{{ $t('basicData.delete') }}</el-button>
            </template>
          </el-popconfirm>
        </template>
        <template #num1_filter="{ column, $panel }">
          <div>
            <div v-for="(option, index) in column.filters" :key="index">
              <input type="type" v-model="option.data" @keyup.enter.native="$panel.confirmFilter()" @input="changeFilterEvent($event, option, $panel)"/>
            </div>
          </div>
        </template>
      </vxe-grid>
    </div>
    <el-dialog
        v-model="dialogVisible"
        :title="$t('user.roleSelection')"
        width="30%"
        :before-close="handleClose"
    >
      <span>
        <el-radio v-for="(item) in roleList"
                     :label="item.id"
                     v-model="userRole.roles" >
          {{item.role}}
        </el-radio>
      </span>
      <template #footer>
      <span class="dialog-footer">
        <el-button @click="dialogVisible = false">{{ $t('basicData.cancelButtonText') }}</el-button>
        <el-button type="primary" @click="roleUpdate">
          {{ $t('basicData.confirmButtonText') }}
        </el-button>
      </span>
      </template>
    </el-dialog>
    <el-dialog
        v-model="dialogVisibleProcess"
        :title="$t('user.roleSelection')"
        width="30%"
        :before-close="handleClose"
    >
      <el-select v-model="processValue" clearable :placeholder="$t('reportingWorks.selectProcess')" default-value="default_city" style="width: 120px">
        <el-option
            v-for="item in processRow['process']"
            :key="item.id"
            :label="item.basic_name"
            :value="item.basic_name"
        />
      </el-select>
      <template #footer>
      <span class="dialog-footer">
        <el-button @click="dialogVisibleProcess = false">{{ $t('basicData.cancelButtonText') }}</el-button>
        <el-button type="primary" @click="updateProcess">
          {{ $t('basicData.confirmButtonText') }}
        </el-button>
      </span>
      </template>
    </el-dialog>
  </div>
</template>
<style scoped>
.dialog-footer button:first-child {
  margin-right: 10px;
}
.head{
  width: 100%;
  height: 35px;
}
.main-table{
  width: 100%;
  height: calc(100% - 0px);
}
</style>
north-glass-erp/northglass-erp/src/views/system/userLog/UserLog.vue
New file
@@ -0,0 +1,61 @@
<script setup>
import {ArrowLeftBold, ArrowRight, Search} from "@element-plus/icons-vue"
import {useRouter,useRoute,onBeforeRouteUpdate} from "vue-router"
import {useI18n} from "vue-i18n"
const { t } = useI18n()
const router = useRouter()
const route = useRoute()
let indexFlag=$ref(1)
function changeRouter(index){
  indexFlag=index
}
</script>
<template>
  <div id="main-div">
    <div id="div-title">
      <el-breadcrumb :separator-icon="ArrowRight">
        <el-breadcrumb-item @click="changeRouter(1)" :class="indexFlag===1?'indexTag':''" :to="{ path: '/main/userLog/userListLog' }">{{$t('日志首页')}}</el-breadcrumb-item>
        <el-breadcrumb-item v-show="false" />
      </el-breadcrumb>
    </div>
    <div id="main-body">
      <router-view :key="route.fullPath" />
    </div>
  </div>
</template>
<style scoped>
#main-div{
  width: 99%;
  height: 100%;
}
#div-title{
  height: 2%;
  width: 100%;
}
#searchButton{
  margin-top: -5px;
  margin-left: 1rem;
}
#searchButton1{
//margin-left: 10rem;
}
/*main-body样式*/
#main-body{
  width: 100%;
  height: 95%;
  margin-top: 1%;
}
#select{
  margin-left:0.5rem;
}
:deep(.indexTag .el-breadcrumb__inner){
  color: #5CADFE !important;
}
</style>
north-glass-erp/src/main/java/com/example/erp/controller/AppController.java
@@ -67,12 +67,14 @@
    @ApiOperation("可入库的成品查询接口")
    @PostMapping("/getSelectWarehousingList")
    @SaCheckPermission("createProductStock.search")
    public Result getSelectWarehousingList(@RequestBody Map<String,String> map){
        return Result.success(finishedGoodsInventoryService.getSelectWarehousingApp(map.get("processId")));
    }
    @ApiOperation("成品入库接口")
    @PostMapping("/addSelectWarehousing")
    @SaCheckPermission("createProductStock.add")
    public Result addSelectWarehousing( @RequestBody Map<String,Object> object){
        return Result.success(finishedGoodsInventoryService.addSelectWarehousing(object));
@@ -80,12 +82,14 @@
    @ApiOperation("可发货的成品查询接口")
    @PostMapping("/getSelectDeliveryDetailList")
    @SaCheckPermission("finishedProductOut.search")
    public Result getSelectDeliveryDetailList(){
        return Result.success(finishedGoodsInventoryService.getSelectDeliveryDetailApp());
    }
    @ApiOperation("成品出库接口")
    @PostMapping("/addDeliveryDetail")
    @SaCheckPermission("finishedProductOut.add")
    public Result addDeliveryDetail( @RequestBody Map<String,Object>  object){
        return Result.success(finishedGoodsInventoryService.addDeliveryDetail(object));
    }
north-glass-erp/src/main/java/com/example/erp/controller/sd/DeliveryController.java
@@ -39,8 +39,8 @@
    @ApiOperation("发货订单查询接口")
    @SaCheckPermission("selectDelivery.search")
    @PostMapping("/getSelectShippingOrder/{pageNum}/{pageSize}/{selectDate}")
    public Result getSelectShippingOrder(@PathVariable Integer pageNum, @PathVariable Integer pageSize,@PathVariable List<String> selectDate, @RequestBody Delivery delivery) throws JsonProcessingException {
        return Result.success(deliveryService.getSelectShippingOrder(pageNum,pageSize,selectDate,delivery));
    public Result getSelectShippingOrder(@PathVariable Integer pageNum, @PathVariable Integer pageSize,@PathVariable List<String> selectDate, @RequestBody Map<String,Object> config) throws JsonProcessingException {
        return Result.success(deliveryService.getSelectShippingOrder(pageNum,pageSize,selectDate,config));
    }
    /*发货报表查询*/
north-glass-erp/src/main/java/com/example/erp/controller/userInfo/UserController.java
@@ -68,4 +68,10 @@
        return Result.success( userService.updateUserName(object));
    }
    @ApiOperation("用户登录记录")
    @PostMapping("/getUserLog")
    public Result getUserLog(){
        return Result.success( userService.getUserLog());
    }
}
north-glass-erp/src/main/java/com/example/erp/dto/sd/DeliverySearchDTO.java
New file
@@ -0,0 +1,74 @@
package com.example.erp.dto.sd;
import com.alibaba.excel.annotation.ExcelProperty;
import com.example.erp.entity.sd.Order;
import lombok.Data;
import java.time.LocalDate;
@Data
public class DeliverySearchDTO {
    @ExcelProperty("编号")
    private Long id;
    @ExcelProperty("发货状态")
    private Integer deliveryState;
    @ExcelProperty("出库状态")
    private Integer stockState;
    @ExcelProperty("付款条件")
    private String paymentTerms;
    @ExcelProperty("发货单号")
    private String deliveryId;
    @ExcelProperty("订单编号")
    private String orderId;
    @ExcelProperty("项目名称")
    private String project;
    @ExcelProperty("客户编号")
    private String customerId;
    @ExcelProperty("客户名称")
    private String customerName;
    @ExcelProperty("发货日期")
    private LocalDate deliveryDate;
    @ExcelProperty("支付方式")
    private String payMethod;
    @ExcelProperty("支付日期")
    private LocalDate payDate;
    @ExcelProperty("销售人id")
    private String salesmanId;
    @ExcelProperty("销售人")
    private String salesman;
    @ExcelProperty("创建人id")
    private String creatorId;
    @ExcelProperty("创建人")
    private String creator;
    @ExcelProperty("联系人")
    private String contacts;
    @ExcelProperty("联系电话")
    private String contactNumber;
    @ExcelProperty("送货地址")
    private String deliveryAddress;
    @ExcelProperty("面积")
    private Double area;
    @ExcelProperty("数量")
    private Integer quantity;
    @ExcelProperty("总金额")
    private Double money;
    @ExcelProperty("其他金额")
    private Double otherMoney;
    @ExcelProperty("运费金额")
    private Double freight;
    @ExcelProperty("运费数量")
    private Integer freightQuantity;
    @ExcelProperty("运费单价")
    private Double freightPrice;
    @ExcelProperty("打印次数")
    private Integer printingNumber;
    @ExcelProperty("备注")
    private String remarks;
    @ExcelProperty("创建时间")
    private LocalDate createTime;
    @ExcelProperty("修改时间")
    private LocalDate updateTime;
    private Order order;
}
north-glass-erp/src/main/java/com/example/erp/entity/sd/Order.java
@@ -9,6 +9,7 @@
import lombok.Data;
import java.time.LocalDate;
import java.util.List;
@Data
@TableName("sd.`order`")
@@ -105,6 +106,8 @@
    private Integer goodsQuantity;
    @TableField(select = false,exist = false)
    private String timeOut;
    @TableField(select = false,exist = false)
    private List<String> excludeOrderIds;
    @TableField(value = "customer_id")
    private Customer  customer;
north-glass-erp/src/main/java/com/example/erp/mapper/sd/DeliveryMapper.java
@@ -1,5 +1,6 @@
package com.example.erp.mapper.sd;
import com.example.erp.dto.sd.DeliverySearchDTO;
import com.example.erp.entity.pp.FlowCard;
import com.example.erp.entity.sd.Delivery;
import com.example.erp.entity.sd.DeliveryDetail;
@@ -17,7 +18,7 @@
    List<Delivery> getSelectShippingOrder(@Param("offset") Integer offset,
                                                      @Param("pageSize") Integer pageSize,String startDate, String endDate,
                                                      @Param("delivery") Delivery delivery);
                                                      @Param("delivery") DeliverySearchDTO delivery,String field, String orderBy);
   Delivery getSelectShippingOrderDetailDelivery(@Param("offset") Integer offset,
                                                             @Param("pageSize") Integer pageSize,
@@ -30,7 +31,7 @@
    Order getSelectShippingOrderDetailDeliverys(@Param("offset") Integer offset,
                                                 @Param("pageSize") Integer pageSize,
                                                 @Param("orderDetail") OrderDetail orderDetail);
    Map<String,Integer> getSelectShippingOrderPageTotal(Integer offset, Integer pageSize, String startDate, String endDate, Delivery delivery);
    Map<String,Integer> getSelectShippingOrderPageTotal(Integer offset, Integer pageSize, String startDate, String endDate, DeliverySearchDTO delivery);
    List<Order> getSelectOrderInventory(@Param("offset") Integer offset,
                                        @Param("pageSize") Integer pageSize,String startDate, String endDate,
north-glass-erp/src/main/java/com/example/erp/mapper/userInfo/UserMapper.java
@@ -8,6 +8,7 @@
import org.apache.ibatis.annotations.Select;
import java.util.List;
import java.util.Map;
@Mapper
@@ -41,4 +42,6 @@
    List<User> findByAddress(String userName);
    String selectOptimizeParmsById(@Param("username") String username);
    List<Map<String, Object>> getUserLog();
}
north-glass-erp/src/main/java/com/example/erp/service/sd/DeliveryService.java
@@ -10,6 +10,8 @@
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.example.erp.dto.sd.DeliveryDetailDTO;
import com.example.erp.dto.sd.DeliveryDetailProductDTO;
import com.example.erp.dto.sd.DeliverySearchDTO;
import com.example.erp.dto.sd.OrderSearchDTO;
import com.example.erp.entity.mm.FinishedOperateLog;
import com.example.erp.entity.sd.*;
import com.example.erp.entity.userInfo.Log;
@@ -60,7 +62,7 @@
    FinishedGoodsInventoryService finishedGoodsInventoryService;
    public Map<String, Object> getSelectShippingOrder(Integer pageNum, Integer pageSize,List<String> selectDate, Delivery delivery) throws JsonProcessingException {
    public Map<String, Object> getSelectShippingOrder(Integer pageNum, Integer pageSize,List<String> selectDate, Map<String,Object> config) throws JsonProcessingException {
        Integer offset = (pageNum - 1) * pageSize;
        String endDate = LocalDate.now().toString();
        String startDate = LocalDate.now().minusDays(15).toString();
@@ -72,8 +74,14 @@
                endDate = selectDate.get(1);
            }
        }
        JSONObject orderJson = new JSONObject(config);
        DeliverySearchDTO delivery = JSONObject.parseObject(JSONObject.toJSONString(orderJson.get("filter")), DeliverySearchDTO.class);
        Map<String,String> sortDate = (Map<String, String>) config.get("sort");
        String field = sortDate.get("field").replaceAll("(?<!^)([A-Z])", "_$1").toLowerCase();
        String orderBy = sortDate.get("order");
        Map<String, Object> map = new HashMap<>();
        map.put("data", deliveryMapper.getSelectShippingOrder(offset, pageSize,startDate,endDate, delivery));
        map.put("data", deliveryMapper.getSelectShippingOrder(offset, pageSize,startDate,endDate, delivery,field, orderBy));
        map.put("total", deliveryMapper.getSelectShippingOrderPageTotal(offset, pageSize,startDate,endDate, delivery));
        List<String> list = new ArrayList<>();
        list.add(startDate);
north-glass-erp/src/main/java/com/example/erp/service/sd/OrderService.java
@@ -29,7 +29,6 @@
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.sql.SQLOutput;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
@@ -67,6 +66,8 @@
    public boolean saveOrder(Map<String,Object> orderMap) throws Exception {
        JSONObject orderJson = new JSONObject(orderMap);
        String orderIdType = orderJson.getString("orderIdType");
        String orderIdTypeLetter = orderJson.getString("orderIdTypeLetter");
        Integer orderIdTypeMantissa = orderJson.getInteger("orderIdTypeMantissa");
        Order order = JSONObject.parseObject(JSONObject.toJSONString(orderJson.get("title")), Order.class);
        List<OrderDetail> OrderDetails = JSONArray.parseArray(JSONObject.toJSONString(orderJson.get("detail")), OrderDetail.class);
        List<OrderOtherMoney> orderOtherMoneyList = JSONArray.parseArray(JSONObject.toJSONString(orderJson.get("otherMoney")), OrderOtherMoney.class);
@@ -85,7 +86,12 @@
            log.setContent(orderMap.toString());
            if(order.getOrderId() == null || order.getOrderId().isEmpty()){
                insertOrder(order,OrderDetails,orderOtherMoneyList,orderIdType, (Map<String, String>) orderMap.get("position"));
                insertOrder(order,
                        OrderDetails,orderOtherMoneyList,orderIdType,
                        (Map<String, String>) orderMap.get("position"),
                        orderIdTypeLetter,
                        orderIdTypeMantissa
                );
                log.setFunction("saveOrder创建:"+order.getOrderId());
            }else {
                updateOrder(order,OrderDetails,orderOtherMoneyList,(Map<String, String>) orderMap.get("position"));
@@ -165,9 +171,9 @@
        return map;
    }
    //生成订单数据
    public void insertOrder(Order order, List<OrderDetail> OrderDetails, List<OrderOtherMoney> orderOtherMoneyList, String orderIdType, Map<String,String> position) {
    public void insertOrder(Order order, List<OrderDetail> OrderDetails, List<OrderOtherMoney> orderOtherMoneyList, String orderIdType, Map<String,String> position, String orderIdTypeLetter, Integer orderIdTypeMantissa) {
        //根据传入的当前月份或者当天生成订单id
        String orderId =  getOrderId(orderIdType);
        String orderId =  getOrderId(orderIdType,orderIdTypeLetter,orderIdTypeMantissa);
        //往主表插数据
        order.setOrderId(orderId);
        order.setCreateOrder(2);
@@ -175,32 +181,34 @@
        insertOtherDetail(orderId,OrderDetails,orderOtherMoneyList,position);
    }
    private String getOrderId(String dateType){
    private String getOrderId(String dateType, String orderIdTypeLetter, Integer orderIdTypeMantissa){
        String orderId = null;
        Integer orderIdTypeLetterLen = orderIdTypeLetter.length();
        Integer count = orderIdTypeLetterLen+orderIdTypeMantissa;
        if(dateType==null || dateType.equals("day")){
            Integer maxOrderId = orderMapper.selectMaxOrderId();
            //查询订单id,并且自增
            String formattedNumber = String.format("%02d", maxOrderId+1);
            String formattedNumber = String.format("%0"+orderIdTypeMantissa+"d", maxOrderId+1);
            //格式化当前日期
            Date currentDate = new Date();
            SimpleDateFormat dateFormat = new SimpleDateFormat("yyMMdd");
            String formattedDate = dateFormat.format(currentDate);
            orderId =  "NG"+formattedDate+formattedNumber;
            orderId =  orderIdTypeLetter+formattedDate+formattedNumber;
        }else if(dateType.equals("month")){
            Integer maxOrderId = orderMapper.selectMaxOrderIdByMonth();
            String formattedNumber = String.format("%04d", maxOrderId+1);
            String formattedNumber = String.format("%0"+(orderIdTypeMantissa+2)+"d", maxOrderId+1);
            Date currentDate = new Date();
            SimpleDateFormat dateFormat = new SimpleDateFormat("yyMM");
            String formattedDate = dateFormat.format(currentDate);
            orderId =  "NG"+formattedDate+formattedNumber;
            orderId =  orderIdTypeLetter+formattedDate+formattedNumber;
        }else if(dateType.equals("year")){
            Integer maxOrderId = orderMapper.selectMaxOrderIdByYear();
            String formattedNumber = String.format("%06d", maxOrderId+1);
            String formattedNumber = String.format("%"+(orderIdTypeMantissa+4)+"d", maxOrderId+1);
            Date currentDate = new Date();
            SimpleDateFormat dateFormat = new SimpleDateFormat("yy");
            String formattedDate = dateFormat.format(currentDate);
            orderId =  "NG"+formattedDate+formattedNumber;
            orderId =  orderIdTypeLetter+formattedDate+formattedNumber;
        }
        return orderId;
    }
@@ -1045,6 +1053,7 @@
        List<Order> list = orderMapper.selectList(new LambdaQueryWrapper<Order>()
                .apply("create_order > 0")
                .apply("date(create_time) between {0} and {1}",startDate, endDate)
                .orderByDesc(Order::getOrderId)
        );
        Integer quantity = 0;
        Double area = 0.00;
north-glass-erp/src/main/java/com/example/erp/service/userInfo/UserService.java
@@ -5,11 +5,13 @@
import com.baomidou.dynamic.datasource.annotation.DS;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.example.erp.controller.dto.UserDTO;
import com.example.erp.entity.userInfo.Log;
import com.example.erp.entity.userInfo.Role;
import com.example.erp.entity.userInfo.User;
import com.example.erp.mapper.pp.ProductionSchedulingMapper;
import com.example.erp.mapper.userInfo.*;
import com.example.erp.tools.TokenTools;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
@@ -27,6 +29,9 @@
   private final PermissionRoleMapper permissionRoleMapper;
    private final ProductionSchedulingMapper productionSchedulingMapper;
    @Autowired
    LogService logService;
    public UserService(UserMapper userMapper, RoleMapper roleMapper, PermissionRoleMapper permissionRoleMapper, UserRoleMapper userRoleMapper, ProductionSchedulingMapper productionSchedulingMapper) {
        this.userMapper = userMapper;
@@ -142,6 +147,13 @@
            userDTO.setToken(StpUtil.getTokenValue());
            Boolean userIsAdmin= userRoleMapper.getUserIsAdmin(user.getId());
            userDTO.setPermissions(permissionRoleMapper.getUserEditPermission(user.getId(),userIsAdmin));
            Log log = new Log();
            log.setOperator(user.getUserName());
            log.setOperatorId(userDTO.getUserId());
            log.setContent(userDTO.toString());
            log.setFunction("用户登录");
            logService.saveLog(log);
            return userDTO;
        }else{
            return null;
@@ -208,6 +220,12 @@
        return map;
    }
    public Object getUserLog() {
        Map<String, Object> map = new HashMap<>();
        map.put("data", userMapper.getUserLog());
        return map;
    }
//查询用户优化参数
public String getOptimizeParms(String username) {
north-glass-erp/src/main/resources/mapper/pp/FolwCard.xml
@@ -808,7 +808,8 @@
               pd.separation,
               fc.technology_number,
               IFNULL(JSON_UNQUOTE(JSON_EXTRACT(od.other_columns, '$.S02')),'') as mapNumber,
               od.building_number
               od.building_number,
               od.weight
        from flow_card as fc
                 left join sd.order_glass_detail as ogd
                           on fc.order_id = ogd.order_id and fc.order_number = ogd.order_number and
@@ -3559,7 +3560,8 @@
        pd.separation,
        #{compound} as technology_number,
        IFNULL(JSON_UNQUOTE(JSON_EXTRACT(od.other_columns, '$.S02')),'') as mapNumber,
        od.building_number
        od.building_number,
        od.weight
        from flow_card as fc
        left join sd.order_glass_detail as ogd
        on fc.order_id = ogd.order_id and fc.order_number = ogd.order_number and
north-glass-erp/src/main/resources/mapper/sd/DeliveryDetailMapper.xml
@@ -486,6 +486,7 @@
                and od.perimeter regexp #{orderDetail.perimeter}
            </if>
        </where>
        order by od.order_id,od.order_number
    </select>
    <select id="getSelectShippingOrderDetailsPageTotal">
north-glass-erp/src/main/resources/mapper/sd/DeliveryMapper.xml
@@ -179,9 +179,6 @@
            <if test="order.createTime != null and order.createTime != ''">
                and o.create_time REGEXP #{order.createTime}
            </if>
            <if test="order.finishedGoodsInventory.quantityAvailable != null and order.finishedGoodsInventory.quantityAvailable != ''">
                and fgi.quantity_available REGEXP #{order.finishedGoodsInventory.quantityAvailable}
            </if>
        </where>
        group by o.order_id order by o.id desc
        limit #{offset},#{pageSize};
@@ -236,9 +233,6 @@
            </if>
            <if test="order.createTime != null and order.createTime != ''">
                and o.create_time REGEXP #{order.createTime}
            </if>
            <if test="order.finishedGoodsInventory.quantityAvailable != null and order.finishedGoodsInventory.quantityAvailable != ''">
                and fgi.quantity_available REGEXP #{order.finishedGoodsInventory.quantityAvailable}
            </if>
        </where>
        group by o.order_id limit #{offset},#{pageSize}) as zu;
@@ -350,7 +344,16 @@
            </where>
        group by d.delivery_id
        order by d.id desc
        order by
        <if test="orderBy == null ">
            d.id desc
        </if>
        <if test="orderBy == 'desc'">
            d.${field} desc
        </if>
        <if test="orderBy == 'asc'">
            d.${field}
        </if>
        limit #{offset},#{pageSize};
    </select>
north-glass-erp/src/main/resources/mapper/userInfo/User.xml
@@ -110,5 +110,10 @@
            SELECT optimize_parms FROM erp_user_info.user WHERE user_name = #{username}
        </select>
    <select id="getUserLog" >
        SELECT operator_id,operator,DATE_FORMAT(create_time, '%Y-%m-%d %H:%i:%s') AS format_create_time
        FROM erp_log.log
        WHERE create_time >= DATE_SUB(NOW(), INTERVAL 1 MONTH) and `function`='用户登录' order by create_time desc limit 0,100
    </select>
</mapper>