Преглед на файлове

Merge remote-tracking branch 'origin/master'

ysm преди 11 месеца
родител
ревизия
b42c2ea8b2
променени са 71 файла, в които са добавени 1970 реда и са изтрити 451 реда
  1. 6 0
      fhKeeper/formulahousekeeper/buildWorkshop.bat
  2. 5 0
      fhKeeper/formulahousekeeper/copy_deploy_files.bat
  3. 12 3
      fhKeeper/formulahousekeeper/customerBuler-crm/src/components/relatedProducts/relatedProducts.vue
  4. 4 1
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/business/detail/index.vue
  5. 4 4
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/business/index.vue
  6. 3 3
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/contacts/component/information.vue
  7. 4 4
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/contacts/index.vue
  8. 6 5
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/corpreport/index.vue
  9. 8 3
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/customer/component/relatedOrders.vue
  10. 4 4
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/customer/index.vue
  11. 8 3
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/order/component/information.vue
  12. 11 5
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/order/component/products.vue
  13. 5 1
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/order/component/rebate.vue
  14. 13 8
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/order/index.vue
  15. 4 4
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/product/index.vue
  16. 2 2
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/tasks/index.vue
  17. 4 4
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/thread/index.vue
  18. 4 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/controller/ProductController.java
  19. 7 3
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/controller/SalesOrderController.java
  20. 13 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/Product.java
  21. 23 3
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/SalesOrder.java
  22. 9 3
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/ProductServiceImpl.java
  23. 36 17
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/SalesOrderServiceImpl.java
  24. 2 1
      fhKeeper/formulahousekeeper/management-crm/src/main/resources/mapper/ProductMapper.xml
  25. 2 1
      fhKeeper/formulahousekeeper/management-crm/src/main/resources/mapper/SalesOrderMapper.xml
  26. 3 3
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ReportController.java
  27. 7 2
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/TimeType.java
  28. 65 7
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java
  29. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ReportMapper.xml
  30. 2 1
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/TimeTypeMapper.xml
  31. 13 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/PlanController.java
  32. 25 2
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/ProductController.java
  33. 5 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/ReportController.java
  34. 214 9
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/WxCorpInfoController.java
  35. 21 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/WxCorpTemplateController.java
  36. 2 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/entity/LeaveSheet.java
  37. 7 1
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/entity/Product.java
  38. 3 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/entity/User.java
  39. 47 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/entity/WxCorpTemplate.java
  40. 1 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/entity/vo/ReportVO.java
  41. 2 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/mapper/ReportMapper.java
  42. 16 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/mapper/WxCorpTemplateMapper.java
  43. 1 1
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/service/ProductService.java
  44. 4 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/service/ReportService.java
  45. 2 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/service/WxCorpInfoService.java
  46. 16 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/service/WxCorpTemplateService.java
  47. 3 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/service/impl/PlanProcedureTotalServiceImpl.java
  48. 10 10
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/service/impl/PlanServiceImpl.java
  49. 70 51
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/service/impl/ProductServiceImpl.java
  50. 110 12
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java
  51. 45 5
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/service/impl/WxCorpInfoServiceImpl.java
  52. 20 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/service/impl/WxCorpTemplateServiceImpl.java
  53. 218 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/task/TimingTask.java
  54. 44 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/util/CodeUtil.java
  55. 153 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/util/FileUtil.java
  56. 150 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/util/ZipUtils.java
  57. 1 1
      fhKeeper/formulahousekeeper/management-workshop/src/main/resources/mapper/ProdProcedureTeamMapper.xml
  58. 2 1
      fhKeeper/formulahousekeeper/management-workshop/src/main/resources/mapper/ProductMapper.xml
  59. 32 5
      fhKeeper/formulahousekeeper/management-workshop/src/main/resources/mapper/ReportMapper.xml
  60. 17 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/resources/mapper/WxCorpTemplateMapper.xml
  61. 13 9
      fhKeeper/formulahousekeeper/timesheet-workshop-h5/src/views/planView/component/planComponent.vue
  62. 16 6
      fhKeeper/formulahousekeeper/timesheet-workshop-h5/src/views/planView/todayPlan/distribution.vue
  63. 5 3
      fhKeeper/formulahousekeeper/timesheet-workshop-h5/src/views/workView/fillReport.vue
  64. 2 1
      fhKeeper/formulahousekeeper/timesheet-workshop-h5/src/views/workView/workView.vue
  65. 71 7
      fhKeeper/formulahousekeeper/timesheet-workshop/src/views/plan/planComponent.vue
  66. 5 4
      fhKeeper/formulahousekeeper/timesheet-workshop/src/views/plan/planComponentDetil.vue
  67. 7 4
      fhKeeper/formulahousekeeper/timesheet-workshop/src/views/product/list.vue
  68. 56 6
      fhKeeper/formulahousekeeper/timesheet-workshop/src/views/statistic/index.vue
  69. 260 213
      fhKeeper/formulahousekeeper/timesheet/src/views/centerManage/centerManage.vue
  70. 1 1
      fhKeeper/formulahousekeeper/timesheet/src/views/settings/timetype.vue
  71. 3 3
      fhKeeper/formulahousekeeper/timesheet/src/views/workReport/daily.vue

+ 6 - 0
fhKeeper/formulahousekeeper/buildWorkshop.bat

@@ -0,0 +1,6 @@
+cd timesheet-workshop
+call build.bat
+cd ../timesheet-workshop_h5
+call build.bat
+cd ../management-workshop
+call build_package.bat

+ 5 - 0
fhKeeper/formulahousekeeper/copy_deploy_files.bat

@@ -0,0 +1,5 @@
+xcopy timesheet\dist\* timesheet_deploy\static_pc\dist\ /y /e /i /q
+xcopy timesheet_h5\dist\* timesheet_deploy\static_h5\dist\ /y /e /i /q
+xcopy management-platform\target\timesheet-3.4.0.jar timesheet_deploy\ /y
+echo "all deployment files are ready!"
+pause

+ 12 - 3
fhKeeper/formulahousekeeper/customerBuler-crm/src/components/relatedProducts/relatedProducts.vue

@@ -33,7 +33,7 @@
             <el-table-column prop="quantity" label="数量" width="180">
                 <template #default="scope">
                     <el-input-number @change="inputNumberChange('quantity', productTable[scope.$index])"
-                        v-model="productTable[scope.$index].quantity" class="mx-4" :min="0" :max="100000000"
+                        v-model="productTable[scope.$index].quantity" class="mx-4" :min="0" :max="scope.row.inventory"
                         controls-position="right" v-if="productTableIndex == scope.$index" />
                     <span v-else>{{ productTable[scope.$index].quantity }}</span>
                 </template>
@@ -57,11 +57,11 @@
         </el-table>
 
         <div class="flex w-full justify-between pt-2 pb-1">
-            <div>整单折扣率(%)</div>
+            <div>整单折扣率(<span class="text-[red]">{{ discountEfficiency }}</span>)</div>
             <div class="flex">
                 <div>已选中产品:<span class="text-[red] pr-2">{{ selectedQuantity }}</span>个</div>
                 <div class="pl-4">
-                    总金额:<span class="pr-1">{{ totalAmount }}</span> 元
+                    总金额:<span class="pr-1 text-[red]">{{ totalAmount }}</span> 元
                 </div>
             </div>
         </div>
@@ -158,6 +158,15 @@ const totalAmount = computed(() => {
     }, 0)
 })
 
+const discountEfficiency = computed(() => {
+    const newProductTable = productTable.value.filter((item: any) => item.productId && item.sellingPrice && item.quantity && item.discount && item.totalPrice)
+    const list = JSON.parse(JSON.stringify(newProductTable || []))
+    const totalAmount = list.reduce((pre: number, cur: any) => { return pre + (cur.totalPrice || 0) }, 0)
+    const totalPrice = list.reduce((pre: number, cur: any) => { return pre + (cur.price * cur.quantity || 0) }, 0)
+    const num = totalAmount / totalPrice * 100
+    return num > 0 ? Number(num.toFixed(2)) + '%' : ''
+})
+
 watchEffect(() => {
     const { productTableList, height, productTableListValue = [] } = props
     console.log(productTableListValue, '<==== 数据')

+ 4 - 1
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/business/detail/index.vue

@@ -44,8 +44,11 @@
       </div>
       <div class="bg-[#075985] rounded-md text itemPing pl-2 pr-2 flex items-center aloneText"
         v-if="currentStage != -1">
-        <el-link :underline="false" v-if="(currentStage + 1) != stageList.length"
+        <!-- <el-link :underline="false" v-if="(currentStage + 1) != stageList.length"
           @click="advancementStage(false)">推进至下个阶段【{{ stageList[currentStage +
+            1]?.name }}】</el-link> -->
+        <el-link :underline="false" v-if="(currentStage + 1) != stageList.length"
+          @click="advancementStageNext(false)">推进至下个阶段【{{ stageList[currentStage +
             1]?.name }}】</el-link>
         <el-link :underline="false" v-else class="ml-4 mr-4" @click="advancementStage(true)">赢单</el-link>
       </div>

+ 4 - 4
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/business/index.vue

@@ -52,9 +52,9 @@
             @click="editNewBusiness(false)">新建商机</el-button>
           <el-button type="primary" @click="showVisible('batchTransferVisible')"
             :disabled="batchTableData.length <= 0">批量转移</el-button>
-          <el-button type="primary" @click="batchDeteleItem()" :disabled="batchTableData.length <= 0">批量删除</el-button>
+          <el-button type="primary" v-permission="['businessDelete']" @click="batchDeteleItem()" :disabled="batchTableData.length <= 0">批量删除</el-button>
           <el-button type="primary" @click="showVisible('stageSetVisible')">阶段设置</el-button>
-          <el-button type="primary" @click="showVisible('deteleBusinessVisible')">回收站</el-button>
+          <el-button type="primary" v-permission="['businessRecycle']" @click="showVisible('deteleBusinessVisible')">回收站</el-button>
           <el-button v-permission="['businessImport']" type="primary"
             @click="showVisible('importVisible')">导入</el-button>
           <el-button v-permission="['businessExport']" type="primary" @click="exportBusinessTableList()"
@@ -72,14 +72,14 @@
                 <template v-else>{{ scope.row[item.prop] }}</template>
               </template>
             </el-table-column>
-            <el-table-column label="操作" fixed="right" width="200">
+            <el-table-column label="操作" fixed="right" width="200" v-permission="['businessAddAnEdit', 'tasksAdd', 'businessDelete']">
               <template #default="scope">
                 <el-button link type="primary" size="large" @click="editNewBusiness(scope.row)"
                   v-permission="['businessAddAnEdit']">编辑</el-button>
                 <el-button link type="primary" size="large" @click="newTask(scope.row)"
                   v-permission="['tasksAdd']">新建任务</el-button>
                 <el-button link type="danger" size="large" @click="businessDeteleItem(scope.row.id, scope.row.name)"
-                  v-permission="['businessAddAnEdit']">删除</el-button>
+                  v-permission="['businessDelete']">删除</el-button>
               </template>
             </el-table-column>
           </el-table>

+ 3 - 3
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/contacts/component/information.vue

@@ -159,14 +159,14 @@ function closeVisible(type: keyof typeof allVisible) {
 }
 
 const formItems = reactive([
-    { label: '联系人', key: 'contactsName', value: '', labelClass: 'w-20 text-right text-gray-500', width: '48%' },
-    { label: '客户', key: 'productName', value: '', labelClass: 'w-22 text-right text-gray-500', width: '48%' },
+    { label: '联系人', key: 'name', value: '', labelClass: 'w-20 text-right text-gray-500', width: '48%' },
+    { label: '客户', key: 'customName', value: '', labelClass: 'w-22 text-right text-gray-500', width: '48%' },
     { label: '电话', key: 'phone', value: '', labelClass: 'w-22 text-right text-gray-500', width: '48%' },
     { label: '邮箱', key: 'email', value: '', labelClass: 'w-22 text-right text-gray-500', width: '48%' },
     { label: '职务', key: 'position', value: '', labelClass: 'w-22 text-right text-gray-500', width: '48%' },
     { label: '性别', key: 'sexValue', value: '', labelClass: 'w-22 text-right text-gray-500', width: '48%' },
     { label: '地址', key: 'address', value: '', labelClass: 'w-22 text-right text-gray-500', width: '48%' },
-    { label: '负责人', key: 'inchargerName', value: '', labelClass: 'w-22 text-right text-gray-500', width: '48%' },
+    { label: '负责人', key: 'ownerName', value: '', labelClass: 'w-22 text-right text-gray-500', width: '48%' },
     { label: '创建人', key: 'creatorName', value: '', labelClass: 'w-22 text-right text-gray-500', width: '48%' },
     { label: '创建时间', key: 'createTime', value: '', labelClass: 'w-22 text-right text-gray-500', width: '48%' },
     { label: '备注', key: 'remark', value: '', labelClass: 'w-22 text-right text-gray-500', width: '100%' },

+ 4 - 4
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/contacts/index.vue

@@ -27,8 +27,8 @@
           <!-- 操作按钮 -->
           <!-- <el-button v-for="(button, index) in actionButtons" :key="index" type="primary">{{ button.text }}</el-button> -->
           <el-button type="primary" v-permission="['contactsAdd']" @click="editContacts(false)">新建联系人</el-button>
-          <el-button type="primary" @click="batchDeteleItem" :disabled="batchTableData.length <= 0">批量删除</el-button>
-          <el-button type="primary" @click="showVisible('deteleContactsVisible')">回收站</el-button>
+          <el-button type="primary" v-permission="['contactsDelete']" @click="batchDeteleItem" :disabled="batchTableData.length <= 0">批量删除</el-button>
+          <el-button type="primary" v-permission="['contactsRecycle']" @click="showVisible('deteleContactsVisible')">回收站</el-button>
           <el-button type="primary" v-permission="['contactsImport']" @click="showVisible('importVisible')">导入</el-button>
           <el-button type="primary" v-permission="['contactsExport']" @click="exportCustomerTableList()" :loading="allLoading.exoprtLoading">导出</el-button>
         </div>
@@ -49,11 +49,11 @@
                 </template>
               </template>
             </el-table-column>
-            <el-table-column :label="'操作'" :width="'200px'" fixed="right" v-permission="['contactsEdit', 'tasksAdd']">
+            <el-table-column :label="'操作'" :width="'200px'" fixed="right" v-permission="['contactsEdit', 'tasksAdd', 'contactsDelete']">
               <template #default="scope">
                 <el-button link type="primary" size="large" v-permission="['contactsEdit']" @click="editContacts(scope.row)">编辑</el-button>
                 <el-button link type="primary" size="large" v-permission="['tasksAdd']" @click="newTask(scope.row)">新建任务</el-button>
-                <el-button link type="danger" size="large" v-permission="['contactsEdit']"
+                <el-button link type="danger" size="large" v-permission="['contactsDelete']"
                   @click="contactsDeteleItem(scope.row.id, scope.row.customName)">删除</el-button>
               </template>
             </el-table-column>

+ 6 - 5
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/corpreport/index.vue

@@ -133,8 +133,8 @@ watchEffect(async () => {
   <div class="m-5 bg-white h-full p-4 rounded">
     <div class="flex justify-between">
       <el-form :model="form" class="flex gap-4">
-        <el-form-item class="w-28">
-          <el-select clearable v-model="form.date">
+        <el-form-item>
+          <el-select clearable v-model="form.date" style="width: 112px">
             <el-option
               v-for="date in dateOptions"
               :key="date.value"
@@ -143,14 +143,15 @@ watchEffect(async () => {
             />
           </el-select>
         </el-form-item>
-        <el-form-item class="w-28">
-          <el-select v-model="form.type" @change="form.member = undefined">
+        <el-form-item>
+          <el-select v-model="form.type" @change="form.member = undefined" style="width: 112px">
             <el-option label="按部门" :value="0" />
             <el-option label="按员工" :value="1" />
           </el-select>
         </el-form-item>
-        <el-form-item class="w-52">
+        <el-form-item>
           <el-select
+            style="width: 208px"
             clearable
             v-model="form.member"
             placeholder="选择部门(默认为本部门及下属部门)"

+ 8 - 3
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/customer/component/relatedOrders.vue

@@ -97,15 +97,20 @@ function saveOrder(flag: boolean) {
                 productTableListData[i].num = productTableListData[i].quantity
         }
         const produt = productTableListData ? JSON.stringify(productTableListData) : []
-        allLoading.editSaveLading = true
-        post(URL_OEDERUPDATE, {
+        const formVal = {
             ...orderTemplateValue.value,
             ...res,
             orderEndDate: res.orderEndDate ? formatDate(res.orderEndDate) : '',
             orderStartDate: res.orderStartDate ? formatDate(res.orderStartDate) : '',
             placeTime: res.placeTime ? formatDate(res.placeTime) : '',
             orderProductDetailString: produt
-        }).then((_res) => {
+        }
+        if((formVal.price || 0) < (formVal.receivedPayment || 0)) {
+            globalPopup?.showError('已回款金额不能大于订单金额')
+            return
+        }
+        allLoading.editSaveLading = true
+        post(URL_OEDERUPDATE, formVal).then((_res) => {
             allVisible.editOrderVisible = flag
             globalPopup?.showSuccess('操作成功')
             if (flag) {

+ 4 - 4
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/customer/index.vue

@@ -56,8 +56,8 @@
           <el-button type="primary" v-permission="['customerAdd']" @click="editCustomer(false)">新建客户</el-button>
           <el-button type="primary" @click="showVisible('batchTransferVisible')"
             :disabled="batchTableData.length <= 0">批量转移</el-button>
-          <el-button type="primary" @click="batchDeteleItem()" :disabled="batchTableData.length <= 0">批量删除</el-button>
-          <el-button type="primary" @click="showVisible('deteleCustomerVisible')">回收站</el-button>
+          <el-button type="primary" v-permission="['customerDelete']" @click="batchDeteleItem()" :disabled="batchTableData.length <= 0">批量删除</el-button>
+          <el-button type="primary" v-permission="['customerRecycle']" @click="showVisible('deteleCustomerVisible')">回收站</el-button>
           <el-button type="primary" v-permission="['customerImport']" @click="showVisible('importVisible')">导入</el-button>
           <el-button type="primary" v-permission="['customerExport']" @click="exportCustomerTableList()"
             :loading="allLoading.exoprtLoading">导出</el-button>
@@ -82,11 +82,11 @@
             <el-table-column prop="inchargerName" label="负责人" width="190"></el-table-column>
             <el-table-column prop="creatorName" label="创建人" width="180"></el-table-column>
             <el-table-column prop="newCreateTime" label="创建时间" width="180"></el-table-column>
-            <el-table-column label="操作" fixed="right" width="200" v-permission="['customerEdit', 'tasksAdd', 'customerEdit']">
+            <el-table-column label="操作" fixed="right" width="200" v-permission="['customerEdit', 'tasksAdd', 'customerDelete']">
               <template #default="scope">
                 <el-button link type="primary" size="large" v-permission="['customerEdit']" @click="editCustomer(scope.row)">编辑</el-button>
                 <el-button link type="primary" size="large" v-permission="['tasksAdd']" @click="newTask(scope.row)">新建任务</el-button>
-                <el-button link type="danger" size="large" v-permission="['customerEdit']"
+                <el-button link type="danger" size="large" v-permission="['customerDelete']"
                   @click="customerDeteleItem(scope.row.id, scope.row.customName)">删除</el-button>
               </template>
             </el-table-column>

+ 8 - 3
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/order/component/information.vue

@@ -97,15 +97,20 @@ const productTableListValue = ref([])
 
 function editOrderSave() {
     orderTemplateRef.value?.getData().then((res: any) => {
-        allLoading.editOrderSaveLoading = true
-        post(URL_OEDERUPDATE, {
+        const formVal = {
             ...orderTemplateValue.value,
             ...res,
             orderEndDate: res.orderEndDate ? formatDate(res.orderEndDate) : '',
             orderStartDate: res.orderStartDate ? formatDate(res.orderStartDate) : '',
             placeTime: res.placeTime ? formatDate(res.placeTime) : '',
             orderProductDetailString: JSON.stringify(productTableListValue.value || [])
-        }).then((_res) => {
+        }
+        if((formVal.price || 0) < (formVal.receivedPayment || 0)) {
+            globalPopup?.showError('已回款金额不能大于订单金额')
+            return
+        }
+        allLoading.editOrderSaveLoading = true
+        post(URL_OEDERUPDATE, formVal).then((_res) => {
             closeVisible('editOrderVisible')
             globalPopup?.showSuccess('操作成功')
             emits('refreshData', 'getDetail')

+ 11 - 5
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/order/component/products.vue

@@ -88,18 +88,24 @@ function saveOrder() {
     const items: any = infoValue.value
     for (var i in productTableListData) {
         productTableListData[i].sealPrice = productTableListData[i].sellingPrice,
-            productTableListData[i].discount = productTableListData[i].discount,
-            productTableListData[i].num = productTableListData[i].quantity
+        productTableListData[i].discount = productTableListData[i].discount,
+        productTableListData[i].num = productTableListData[i].quantity
     }
     const produt = productTableListData ? JSON.stringify(productTableListData) : []
-    allLoading.editSaveLading = true
-    post(URL_OEDERUPDATE, {
+    const formVal = {
         ...items,
         orderEndDate: items.orderEndDate ? items.orderEndDate : '',
         orderStartDate: items.orderStartDate ? items.orderStartDate : '',
         placeTime: items.placeTime ? formatDate(items.placeTime) : '',
         orderProductDetailString: produt
-    }).then(() => {
+    }
+    if((formVal.price || 0) < (formVal.receivedPayment || 0)) {
+      globalPopup?.showError('已回款金额不能大于订单金额')
+      return
+    }
+    allLoading.editSaveLading = true
+    console.log(formVal, '<==== 将要传的值')
+    post(URL_OEDERUPDATE, formVal).then(() => {
         globalPopup?.showSuccess('操作成功')
         allLoading.editSaveLading = false
         closeVisible('editOrderVisible')

+ 5 - 1
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/order/component/rebate.vue

@@ -71,6 +71,7 @@ const operationRecordtable = ref([])
 const mony = ref('')
 const monyItem = ref<any>({})
 const info = ref<any>({})
+const theRebate = ref<number>(0)
 
 function deteItem(item: any) {
     confirmAction(`确定删除该回款记录吗?`).then(() => {
@@ -84,11 +85,13 @@ function deteItem(item: any) {
 }
 
 function editRebate(item: any) {
+    console.log(theRebate.value)
     if (!item) {
         allText.rebateText = '新增回款'
         mony.value = ''
         monyItem.value = {}
     } else {
+        theRebate.value = theRebate.value + Number(item.money)
         monyItem.value = item
         mony.value = item.money
         allText.rebateText = '编辑回款'
@@ -102,7 +105,7 @@ function saveRebate() {
         globalPopup?.showWarning(Number(mony.value as string) < 0 ? '请不要输入负数' : '请输入金额')
         return
     }
-    if(Number(mony.value as string) > info.value.unReceivedPayment) {
+    if(Number(mony.value as string) > theRebate.value) {
         globalPopup?.showWarning('回款金额超过了未回款金额')
         return
     }
@@ -123,6 +126,7 @@ watchEffect(() => {
     const { data, information } = props
     operationRecordtable.value = data || []
     info.value = information
+    theRebate.value = Number(information.unReceivedPayment || 0)
 });
 // 生命周期钩子
 onMounted(() => {

+ 13 - 8
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/order/index.vue

@@ -38,8 +38,8 @@
           <!-- 操作按钮 -->
           <el-button type="primary" v-permission="['orderAdd']" @click="editOrder(false)">新建订单</el-button>
           <el-button type="primary" :disabled="batchTableData.length <= 0">批量转移</el-button>
-          <el-button type="primary" @click="batchDeteleItem()" :disabled="batchTableData.length <= 0">批量删除</el-button>
-          <el-button type="primary" @click="showVisible('deteleOrderVisible')">回收站</el-button>
+          <el-button type="primary" v-permission="['orderDelete']" @click="batchDeteleItem()" :disabled="batchTableData.length <= 0">批量删除</el-button>
+          <el-button type="primary" v-permission="['orderRecycle']" @click="showVisible('deteleOrderVisible')">回收站</el-button>
           <el-button type="primary" v-permission="['orderImport']" @click="showVisible('importVisible')">导入</el-button>
           <el-button type="primary" v-permission="['orderExport']" @click="exportOrderTableList()" :loading="allLoading.exoprtLoading">导出</el-button>
         </div>
@@ -62,7 +62,7 @@
               <template #default="scope">
                 <el-button link type="primary" size="large" @click="editOrder(scope.row)">编辑</el-button>
                 <el-button link type="primary" size="large" v-permission="['tasksEdit']" @click="newTask(scope.row)">新建任务</el-button>
-                <el-button link type="danger" size="large"
+                <el-button link type="danger" size="large" v-permission="['orderDelete']"
                   @click="orderDeteleItem(scope.row.id, scope.row.orderName)">删除</el-button>
               </template>
             </el-table-column>
@@ -196,7 +196,7 @@ const filterItems = ref<FilterItem[]>([
   { label: '订单编号', key: 'orderCode', type: 'input' },
   { label: '订单名称', key: 'orderName', type: 'input' },
   { label: '客户名称', key: 'customId', type: 'select', options: selectData.Customer },
-  { label: '商机名称', key: 'businessOpportunityId', type: 'input' },
+  { label: '商机名称', key: 'businessName', type: 'input' },
   { label: '订单类型', key: 'ordertype', type: 'select', options: selectData.OrderType },
   { label: '回款状态', key: 'receivedStatus', type: 'select', options: selectData.RemittanceStatus },
   { label: '负责人', key: 'inchargerId', type: 'select', options: selectData.Personnel },
@@ -291,15 +291,20 @@ function saveOrder(flag: boolean) {
         productTableListData[i].num = productTableListData[i].quantity
     }
     const produt = productTableListData ? JSON.stringify(productTableListData) : []
-    allLoading.editSaveLading = true
-    post(URL_OEDERUPDATE, {
+    const formVal = {
       ...orderTemplateValue.value,
       ...res,
       orderEndDate: res.orderEndDate ? formatDate(res.orderEndDate) : '',
       orderStartDate: res.orderStartDate ? formatDate(res.orderStartDate) : '',
       placeTime: res.placeTime ? formatDate(res.placeTime) : '',
       orderProductDetailString: produt
-    }).then((_res) => {
+    }
+    if((formVal.price || 0) < (formVal.receivedPayment || 0)) {
+      globalPopup?.showError('已回款金额不能大于订单金额')
+      return
+    }
+    allLoading.editSaveLading = true
+    post(URL_OEDERUPDATE, formVal).then((_res) => {
       allVisible.editOrderVisible = flag
       globalPopup?.showSuccess('保存成功')
       if (flag) {
@@ -430,7 +435,7 @@ function setFilterItems() {
     { label: '订单编号', key: 'orderCode', type: 'input' },
     { label: '订单名称', key: 'orderName', type: 'input' },
     { label: '客户名称', key: 'customId', type: 'select', options: selectData.Customer },
-    { label: '商机名称', key: 'businessOpportunityId', type: 'input' },
+    { label: '商机名称', key: 'businessName', type: 'input' },
     { label: '订单类型', key: 'ordertype', type: 'select', options: selectData.OrderType },
     { label: '回款状态', key: 'receivedStatus', type: 'select', options: selectData.RemittanceStatus },
     { label: '负责人', key: 'inchargerId', type: 'select', options: selectData.Personnel },

+ 4 - 4
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/product/index.vue

@@ -45,8 +45,8 @@
       <div class="bg-white w-full h-full p-3 shadow-md rounded-md flex flex-col">
         <div class="flex justify-end pb-3">
           <el-button type="primary" v-permission="['productAdd']" @click="editProduct(false)">新建产品</el-button>
-          <el-button type="primary" @click="batchDelete()">批量删除</el-button>
-          <el-button type="primary" @click="showDeteleProduct(true)">回收站</el-button>
+          <el-button type="primary" v-permission="['productDelete']" @click="batchDelete()">批量删除</el-button>
+          <el-button type="primary" v-permission="['productRecycle']" @click="showDeteleProduct(true)">回收站</el-button>
           <el-button type="primary" v-permission="['productImport']" @click="dialogVisible.importVisible = true">导入</el-button>
           <el-button type="primary" v-permission="['productExport']" @click="exportProductTableList()" :loading="allLoading.exoprtLoading">导出</el-button>
         </div>
@@ -75,10 +75,10 @@
             <el-table-column prop="inchargerName" label="负责人" width="190"></el-table-column>
             <el-table-column prop="creatorName" label="创建人" width="180"></el-table-column>
             <el-table-column prop="createTime" label="创建时间" width="180"></el-table-column>
-            <el-table-column label="操作" fixed="right" width="200" v-permission="['productEdit']">
+            <el-table-column label="操作" fixed="right" width="200" v-permission="['productEdit', 'productDelete']">
               <template #default="scope">
                 <el-button link type="primary" size="large" @click.stop="editProduct(scope.row)">编辑</el-button>
-                <el-button link type="danger" size="large" @click.stop="deteleRow([scope.row])">删除</el-button>
+                <el-button link type="danger" v-permission="['productDelete']" size="large" @click.stop="deteleRow([scope.row])">删除</el-button>
               </template>
             </el-table-column>
           </el-table>

+ 2 - 2
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/tasks/index.vue

@@ -53,7 +53,7 @@
       <div class="bg-white w-full h-full p-3 shadow-md rounded-md flex flex-col">
         <div class="ml-auto p-3">
           <el-button type="primary" v-permission="['tasksAdd']" @click="createTasks()">创建任务</el-Button>
-          <el-button type="primary" :disabled="len == 0" :loading="btnLoading" @click="deleteTasks()">批量删除</el-Button>
+          <el-button type="primary" v-permission="['tasksDelete']" :disabled="len == 0" :loading="btnLoading" @click="deleteTasks()">批量删除</el-Button>
           <el-button type="primary" v-permission="['tasksImport']" @click="openImportModal()">导入</el-Button>
           <!-- <el-button type="primary" :loading="btnLoading" @click="exportTasks()">导出</el-Button> -->
           <el-button type="primary" v-permission="['tasksExport']" :loading="btnLoading" @click="newExportTasks()">导出</el-Button>
@@ -133,7 +133,7 @@
                   完成
                 </el-button>
 
-                <el-button link type="danger" @click.prevent="deleteRow(scope.row)">
+                <el-button link type="danger" v-permission="['tasksDelete']" @click.prevent="deleteRow(scope.row)">
                   删除
                 </el-button>
               </template>

+ 4 - 4
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/thread/index.vue

@@ -54,8 +54,8 @@
         <div class="flex justify-end pb-3">
           <el-button type="primary" v-permission="['threadAdd']" @click="editClue(false)">新建线索</el-button>
           <el-button type="primary" :disabled="batchTableData.length <= 0" @click="batchTransfer()">批量转移</el-button>
-          <el-button type="primary" :disabled="batchTableData.length <= 0" @click="batchDeletes()">批量删除</el-button>
-          <el-button type="primary" @click="showDeteleClue(true)">回收站</el-button>
+          <el-button type="primary" v-permission="['threadDelete']" :disabled="batchTableData.length <= 0" @click="batchDeletes()">批量删除</el-button>
+          <el-button type="primary" v-permission="['threadRecycle']" @click="showDeteleClue(true)">回收站</el-button>
           <el-button type="primary" v-permission="['threadImport']" @click="dialogVisible.importVisible = true">导入</el-button>
           <el-button type="primary" v-permission="['threadExport']" @click="exportTheadTableList()" :loading="allLoading.exoprtLoading">导出</el-button>
         </div>
@@ -76,13 +76,13 @@
             <el-table-column prop="inchargerName" label="负责人" width="190"></el-table-column>
             <el-table-column prop="createName" label="创建人" width="180"></el-table-column>
             <el-table-column prop="createTime" label="创建时间" width="180"></el-table-column>
-            <el-table-column label="操作" fixed="right" width="200">
+            <el-table-column label="操作" fixed="right" width="200" v-permission="['threadEdit', 'tasksAdd', 'threadDelete']">
               <template #default="scope">
                 <el-button link type="primary" size="large" @click="editClue(scope.row)" v-permission="['threadEdit']">编辑</el-button>
                 <!-- <el-button link type="primary" size="large"
                   @click="dialogVisible.taskModalVisible = true">新建任务</el-button> -->
                 <el-button link type="primary" size="large" @click="newTask(scope.row)" v-permission="['tasksAdd']">新建任务</el-button>
-                <el-button link type="danger" size="large" @click.prevent="deleteRow(scope.row)" v-permission="['threadEdit']">删除</el-button>
+                <el-button link type="danger" size="large" @click.prevent="deleteRow(scope.row)" v-permission="['threadDelete']">删除</el-button>
               </template>
             </el-table-column>
           </el-table>

+ 4 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/controller/ProductController.java

@@ -277,6 +277,10 @@ public class ProductController {
             if(user.isPresent()){
                 c.setCreatorName(user.get().getName());
             }
+            Optional<User> contacts = userList.stream().filter(u -> u.getId().equals(c.getContactsId())).findFirst();
+            if(contacts.isPresent()){
+                c.setContactsName(contacts.get().getName());
+            }
             Optional<User> incharger = userList.stream().filter(u -> u.getId().equals(c.getInchargerId())).findFirst();
             if(incharger.isPresent()){
                 c.setInchargerName(incharger.get().getName());

+ 7 - 3
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/controller/SalesOrderController.java

@@ -106,7 +106,7 @@ public class SalesOrderController {
             return msg;
         }
         if(countName>0){
-            msg.setError("订单名称为["+order.getOrderCode()+"]的订单已存在");
+            msg.setError("订单名称为["+order.getOrderName()+"]的订单已存在");
             return msg;
         }
         //todo:生成操作记录
@@ -117,6 +117,7 @@ public class SalesOrderController {
         auditLogCenter.setModuleCode("SalesOrder");;
         if(order.getId()==null){
             auditLogCenter.setAuditorContent("创建了订单");
+            auditLogCenterService.save(auditLogCenter);
         }else {
             SalesOrder oldOrder = salesOrderService.getById(order.getId());
             BeanChangeUtil<Product> beanChangeUtil = new BeanChangeUtil();
@@ -124,10 +125,10 @@ public class SalesOrderController {
             //发生变化才生成记录
             if(!StringUtils.isEmpty(content.trim())){
                 auditLogCenter.setAuditorContent("编辑了订单");
+                auditLogCenterService.save(auditLogCenter);
             }
 
         }
-        auditLogCenterService.save(auditLogCenter);
         if(!salesOrderService.saveOrUpdate(order)){
             msg.setError("验证失败");
             return msg;
@@ -139,8 +140,11 @@ public class SalesOrderController {
             List<Integer> productIds = orderProductDetails.stream().map(OrderProductDetail::getProductId).distinct().collect(Collectors.toList());
             productIds.add(-1);
             List<Product> productList = productService.list(new LambdaQueryWrapper<Product>().in(Product::getId, productIds));
+            //移除旧的数据进行更新
+            orderProductDetailService.remove(new LambdaQueryWrapper<OrderProductDetail>().eq(OrderProductDetail::getOrderId,order.getId()));
             if(orderProductDetails.size()>0){
                 for (OrderProductDetail orderProductDetail : orderProductDetails) {
+                    orderProductDetail.setId(null);
                     orderProductDetail.setOrderId(order.getId());
                     Optional<Product> first = productList.stream().filter(p -> p.getId().equals(orderProductDetail.getProductId())).findFirst();
                     if(first.isPresent()){
@@ -154,7 +158,7 @@ public class SalesOrderController {
                         }
                     }
                 }
-                orderProductDetailService.saveOrUpdateBatch(orderProductDetails);
+                orderProductDetailService.saveBatch(orderProductDetails);
             }
         }
         return msg;

+ 13 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/Product.java

@@ -9,6 +9,7 @@ import com.baomidou.mybatisplus.annotation.TableField;
 import java.io.Serializable;
 
 import com.fasterxml.jackson.annotation.JsonFormat;
+import com.management.platform.config.PropertyMsg;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.experimental.Accessors;
@@ -39,48 +40,56 @@ public class Product extends Model<Product> {
      * 产品名称
      */
     @TableField("product_name")
+    @PropertyMsg("产品名称")
     private String productName;
 
     /**
      * 产品编号
      */
     @TableField("product_code")
+    @PropertyMsg("产品编号")
     private String productCode;
 
     /**
      * 类型
      */
     @TableField("type")
+    @PropertyMsg("类型")
     private Integer type;
 
     /**
      * 单位
      */
     @TableField("unit")
+    @PropertyMsg("单位")
     private Integer unit;
 
     /**
      * 单价
      */
     @TableField("price")
+    @PropertyMsg("单价")
     private BigDecimal price;
 
     /**
      * 库存数量
      */
     @TableField("inventory")
+    @PropertyMsg("库存数量")
     private Integer inventory;
 
     /**
      * 状态 0-下架 1-上架
      */
     @TableField("status")
+    @PropertyMsg("状态")
     private Integer status;
 
     /**
      * 负责人id
      */
     @TableField("incharger_id")
+    @PropertyMsg("负责人")
     private String inchargerId;
 
     /**
@@ -131,6 +140,7 @@ public class Product extends Model<Product> {
      * 描述
      */
     @TableField("descs")
+    @PropertyMsg("描述")
     private String descs;
 
     /**
@@ -139,6 +149,9 @@ public class Product extends Model<Product> {
     @TableField("is_delete")
     private Integer isDelete;
 
+    @TableField("update_time")
+    private LocalDateTime updateTime;
+
     @TableField(exist = false)
     private String inchargerName;
 

+ 23 - 3
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/SalesOrder.java

@@ -11,6 +11,7 @@ import java.io.Serializable;
 import java.util.List;
 
 import com.fasterxml.jackson.annotation.JsonFormat;
+import com.management.platform.config.PropertyMsg;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.experimental.Accessors;
@@ -41,51 +42,58 @@ public class SalesOrder extends Model<SalesOrder> {
      * 订单名称
      */
     @TableField("order_name")
+    @PropertyMsg("订单名称")
     private String orderName;
 
     /**
      * 订单编号
      */
     @TableField("order_code")
+    @PropertyMsg("订单编号")
     private String orderCode;
 
     /**
      * 客户id
      */
     @TableField("custom_id")
+    @PropertyMsg("客户")
     private Integer customId;
 
     /**
      * 商机id
      */
     @TableField("business_opportunity_id")
+    @PropertyMsg("商机")
     private Integer businessOpportunityId;
 
     /**
      * 订单金额
      */
     @TableField("price")
+    @PropertyMsg("订单金额")
     private BigDecimal price;
 
     /**
      * 联系人id
      */
     @TableField("contacts_id")
+    @PropertyMsg("联系人")
     private Integer contactsId;
 
     /**
      * 订单类型
      */
     @TableField("type")
+    @PropertyMsg("订单类型")
     private Integer type;
 
     /**
      * 下单时间
      */
     @TableField("place_time")
-    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
-    private LocalDateTime placeTime;
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private LocalDate placeTime;
 
     /**
      * 订单开始时间
@@ -93,6 +101,7 @@ public class SalesOrder extends Model<SalesOrder> {
     @TableField("order_start_date")
     @DateTimeFormat(pattern = "yyyy-MM-dd")
     @JsonFormat(pattern = "yyyy-MM-dd")
+    @PropertyMsg("订单开始时间")
     private LocalDate orderStartDate;
 
     /**
@@ -101,24 +110,28 @@ public class SalesOrder extends Model<SalesOrder> {
     @TableField("order_end_date")
     @DateTimeFormat(pattern = "yyyy-MM-dd")
     @JsonFormat(pattern = "yyyy-MM-dd")
+    @PropertyMsg("订单结束时间")
     private LocalDate orderEndDate;
 
     /**
      * 已回款金额
      */
     @TableField("received_payment")
+    @PropertyMsg("已回款金额")
     private BigDecimal receivedPayment;
 
     /**
      * 未回款金额
      */
     @TableField("un_received_payment")
+    @PropertyMsg("未回款金额")
     private BigDecimal unReceivedPayment;
 
     /**
      * 回款状态 0-未回款 1-已回款 2-已完全回款
      */
     @TableField("received_status")
+    @PropertyMsg("回款状态")
     private Integer receivedStatus;
 
 
@@ -126,24 +139,28 @@ public class SalesOrder extends Model<SalesOrder> {
      * 客户签约人
      */
     @TableField("custom_signer")
+    @PropertyMsg("客户签约人")
     private String customSigner;
 
     /**
      * 公司签约人
      */
     @TableField("company_signer")
+    @PropertyMsg("公司签约人")
     private String companySigner;
 
     /**
      * 负责人
      */
     @TableField("incharger_id")
+    @PropertyMsg("负责人")
     private String inchargerId;
 
     /**
      * 备注
      */
     @TableField("remark")
+    @PropertyMsg("备注")
     private String remark;
 
     @TableField("create_time")
@@ -196,6 +213,9 @@ public class SalesOrder extends Model<SalesOrder> {
     @TableField("plate5")
     private String plate5;
 
+    @TableField("update_time")
+    private LocalDateTime updateTime;
+
 
     @TableField(exist = false)
     private String orderProductDetailString;

+ 9 - 3
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/ProductServiceImpl.java

@@ -123,7 +123,7 @@ public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> impl
                 List<Integer> finalDeptIds2 = deptIds;
                 List<String> userIds = userList.stream().filter(u -> finalDeptIds2.contains(u.getDepartmentId())).map(User::getId).collect(Collectors.toList());
                 userIds.add(targetUsr.getId());
-                queryWrapper.in(Product::getCreatorId,userIds);
+                queryWrapper.and(wrapper->wrapper.in(Product::getCreatorId,userIds).or().in(Product::getInchargerId,userIds));
             }
         }
         if(!StringUtils.isEmpty(userId)){
@@ -182,6 +182,10 @@ public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> impl
     @Override
     public HttpRespMsg importData(MultipartFile multipartFile) {
         HttpRespMsg msg=new HttpRespMsg();
+        if(!multipartFile.getOriginalFilename().endsWith(".xlsx")){
+            msg.setError("文件格式错误,请使用.xlsx格式的Excel文件进行导入");
+            return msg;
+        }
         String fileName = multipartFile.getOriginalFilename();
         File file = new File(fileName == null ? "file" : fileName);
         User user = userMapper.selectById(request.getHeader("token"));
@@ -391,6 +395,7 @@ public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> impl
             }
         } catch (IOException | NoSuchMethodException e) {
             e.printStackTrace();
+            msg.setError("验证失败");
         } catch (IllegalAccessException e) {
             e.printStackTrace();
         } catch (InvocationTargetException e) {
@@ -555,10 +560,11 @@ public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> impl
                 deptIds=deptIds.stream().distinct().collect(Collectors.toList());
                 List<Integer> finalDeptIds2 = deptIds;
                 List<String> userIds = userList.stream().filter(u -> finalDeptIds2.contains(u.getDepartmentId())).map(User::getId).collect(Collectors.toList());
-                userIds.add("-1");
-                queryWrapper.in(Product::getCreatorId,userIds);
+                userIds.add(targetUsr.getId());
+                queryWrapper.and(wrapper->wrapper.in(Product::getCreatorId,userIds).or().in(Product::getInchargerId,userIds));
             }
         }
+        queryWrapper.orderByDesc(Product::getUpdateTime);
         IPage<Product> productIPage = productMapper.selectPage(new Page<>(pageIndex, pageSize,true), queryWrapper);
         List<Product> records = productIPage.getRecords();
         records.forEach(r->{

+ 36 - 17
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/SalesOrderServiceImpl.java

@@ -19,6 +19,7 @@ import org.apache.poi.hssf.usermodel.HSSFWorkbook;
 import org.apache.poi.ss.usermodel.CellType;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.StringUtils;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.multipart.MultipartFile;
@@ -158,16 +159,18 @@ public class SalesOrderServiceImpl extends ServiceImpl<SalesOrderMapper, SalesOr
             orderLambdaQueryWrapper.inSql(SalesOrder::getBusinessOpportunityId,"select id from business_opportunity where name like '%"+businessName+"%'");
         }
         if(receivedStatus!=null){
-            if(receivedStatus==1){
-                //回款金额不为空 切大于0 作为已回款状态
-                orderLambdaQueryWrapper.and(wrapper->wrapper.isNotNull(SalesOrder::getReceivedPayment).gt(SalesOrder::getReceivedPayment,0));
-            }else {
-                //回款金额为空 或者等于0 作为未回款状态
-                orderLambdaQueryWrapper.and(wrapper->wrapper.isNull(SalesOrder::getReceivedPayment).or().eq(SalesOrder::getReceivedPayment,0));
-            }
+//            if(receivedStatus==1){
+//                //回款金额不为空 切大于0 作为已回款状态
+//                orderLambdaQueryWrapper.and(wrapper->wrapper.isNotNull(SalesOrder::getReceivedPayment).gt(SalesOrder::getReceivedPayment,0));
+//            }else {
+//                //回款金额为空 或者等于0 作为未回款状态
+//                orderLambdaQueryWrapper.and(wrapper->wrapper.isNull(SalesOrder::getReceivedPayment).or().eq(SalesOrder::getReceivedPayment,0));
+//            }
+            orderLambdaQueryWrapper.eq(SalesOrder::getReceivedStatus,receivedStatus);
         }
         if(!StringUtils.isEmpty(startTime)&&!StringUtils.isEmpty(endTime)){
-            orderLambdaQueryWrapper.lt(SalesOrder::getOrderStartDate,endTime).gt(SalesOrder::getOrderEndDate,startTime);
+//            orderLambdaQueryWrapper.lt(SalesOrder::getOrderStartDate,endTime).gt(SalesOrder::getOrderEndDate,startTime);
+            orderLambdaQueryWrapper.between(SalesOrder::getPlaceTime,startTime,endTime);
         }
         if(!StringUtils.isEmpty(orderName)){
             orderLambdaQueryWrapper.like(SalesOrder::getOrderName,orderName);
@@ -184,7 +187,13 @@ public class SalesOrderServiceImpl extends ServiceImpl<SalesOrderMapper, SalesOr
             pageIndex=-1;
             pageSize=-1;
         }
-        orderLambdaQueryWrapper.orderByDesc(SalesOrder::getCreateTime);
+        if(isDelete!=null){
+            orderLambdaQueryWrapper.eq(SalesOrder::getIsDelete,isDelete);
+            orderLambdaQueryWrapper.orderByDesc(SalesOrder::getUpdateTime);
+        }else {
+            orderLambdaQueryWrapper.eq(SalesOrder::getIsDelete,0);
+            orderLambdaQueryWrapper.orderByDesc(SalesOrder::getCreateTime);
+        }
         IPage<SalesOrder> orderIPage = salesOrderMapper.selectPage(new Page<>(pageIndex, pageSize), orderLambdaQueryWrapper);
         List<SalesOrder> records = orderIPage.getRecords();
         List<Integer> orderIds = records.stream().map(SalesOrder::getId).distinct().collect(Collectors.toList());
@@ -279,8 +288,13 @@ public class SalesOrderServiceImpl extends ServiceImpl<SalesOrderMapper, SalesOr
     }
 
     @Override
+    @Transactional
     public HttpRespMsg importData(MultipartFile multipartFile) {
         HttpRespMsg msg=new HttpRespMsg();
+        if(!multipartFile.getOriginalFilename().endsWith(".xlsx")){
+            msg.setError("文件格式错误,请使用.xlsx格式的Excel文件进行导入");
+            return msg;
+        }
         String fileName = multipartFile.getOriginalFilename();
         File file = new File(fileName == null ? "file" : fileName);
         User user = userMapper.selectById(request.getHeader("token"));
@@ -473,7 +487,7 @@ public class SalesOrderServiceImpl extends ServiceImpl<SalesOrderMapper, SalesOr
                         }
                     }else if(modelName.equals("placeTime")){
                         if(!StringUtils.isEmpty(cell.getStringCellValue())){
-                            order.setPlaceTime(LocalDateTime.parse(cell.getStringCellValue(),df1));
+                            order.setPlaceTime(LocalDate.parse(cell.getStringCellValue(),df));
                         }
                     }else if(modelName.equals("orderStartDate")){
                         if(!StringUtils.isEmpty(cell.getStringCellValue())){
@@ -552,12 +566,14 @@ public class SalesOrderServiceImpl extends ServiceImpl<SalesOrderMapper, SalesOr
             }
         } catch (IOException | NoSuchMethodException e) {
             e.printStackTrace();
+            msg.setError("验证失败");
         } catch (IllegalAccessException e) {
             e.printStackTrace();
         } catch (InvocationTargetException e) {
             e.printStackTrace();
         } catch (Exception e) {
             e.printStackTrace();
+            msg.setError("验证失败");
         }
         return msg;
     }
@@ -642,6 +658,7 @@ public class SalesOrderServiceImpl extends ServiceImpl<SalesOrderMapper, SalesOr
     public HttpRespMsg salesKit(Integer queryType,Integer dateType,String startDate, String endDate) {
         HttpRespMsg msg=new HttpRespMsg();
         DateTimeFormatter df=DateTimeFormatter.ofPattern("yyyy-MM-dd");
+        DateTimeFormatter df1=DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
         LambdaQueryWrapper<Custom> customLambdaQueryWrapper = new LambdaQueryWrapper<>();
         LambdaQueryWrapper<Custom> customLambdaQueryWrapper1 = new LambdaQueryWrapper<>();
         LambdaQueryWrapper<Contacts> contactsLambdaQueryWrapper = new LambdaQueryWrapper<>();
@@ -655,11 +672,13 @@ public class SalesOrderServiceImpl extends ServiceImpl<SalesOrderMapper, SalesOr
         User user = userMapper.selectById(request.getHeader("token"));
         List<Department> allDeptList = departmentMapper.selectList(new LambdaQueryWrapper<Department>().eq(Department::getCompanyId, user.getCompanyId()));
         if(!StringUtils.isEmpty(startDate)&&!StringUtils.isEmpty(endDate)){
-            customLambdaQueryWrapper.between(Custom::getCreateTime,startDate,endDate);
+            startDate=startDate+" 00:00:00";
+            endDate=endDate+" 23:59:59";
+            customLambdaQueryWrapper.between(Custom::getCreateTime,LocalDateTime.parse(startDate,df1),LocalDateTime.parse(endDate,df1));
             contactsLambdaQueryWrapper.between(Contacts::getCreateTime,startDate,endDate);
-            businessOpportunityLambdaQueryWrapper.between(BusinessOpportunity::getCreateTime,startDate,endDate);
-            salesOrderLambdaQueryWrapper.between(SalesOrder::getCreateTime,startDate,endDate);
-            clueLambdaQueryWrapper.between(Clue::getCreateTime,startDate,endDate);
+            businessOpportunityLambdaQueryWrapper.between(BusinessOpportunity::getCreateTime,LocalDateTime.parse(startDate,df1),LocalDateTime.parse(endDate,df1));
+            salesOrderLambdaQueryWrapper.between(SalesOrder::getCreateTime,LocalDateTime.parse(startDate,df1),LocalDateTime.parse(endDate,df1));
+            clueLambdaQueryWrapper.between(Clue::getCreateTime,LocalDateTime.parse(startDate,df1),LocalDateTime.parse(endDate,df1));
         }
         if(dateType!=null){
             switch (dateType){
@@ -736,7 +755,7 @@ public class SalesOrderServiceImpl extends ServiceImpl<SalesOrderMapper, SalesOr
                     deptIds.add(-1);
                     List<User> userList = userMapper.selectList(new LambdaQueryWrapper<User>().in(User::getDepartmentId, deptIds));
                     List<String> userIds = userList.stream().map(User::getId).distinct().collect(Collectors.toList());
-                    userIds.add("-1");
+                    userIds.add(user.getId());
                     customLambdaQueryWrapper.in(Custom::getCreatorId,userIds);
                     contactsLambdaQueryWrapper.in(Contacts::getCreatorId,userIds);
                     businessOpportunityLambdaQueryWrapper.in(BusinessOpportunity::getCreatorId,userIds);
@@ -754,7 +773,7 @@ public class SalesOrderServiceImpl extends ServiceImpl<SalesOrderMapper, SalesOr
                     Integer targetDeptId = user.getDepartmentId();
                     List<User> users = userMapper.selectList(new LambdaQueryWrapper<User>().eq(User::getDepartmentId, targetDeptId));
                     List<String> targetUserIds = users.stream().map(User::getId).distinct().collect(Collectors.toList());
-                    targetUserIds.add("-1");
+                    targetUserIds.add(user.getId());
                     customLambdaQueryWrapper.in(Custom::getCreatorId,targetUserIds);
                     contactsLambdaQueryWrapper.in(Contacts::getCreatorId,targetUserIds);
                     businessOpportunityLambdaQueryWrapper.in(BusinessOpportunity::getCreatorId,targetUserIds);
@@ -773,7 +792,7 @@ public class SalesOrderServiceImpl extends ServiceImpl<SalesOrderMapper, SalesOr
                     List<Integer> branchDepartment = getBranchDepartment(targetDeptId1, allDeptList);
                     List<User> users1 = userMapper.selectList(new LambdaQueryWrapper<User>().in(User::getDepartmentId, branchDepartment));
                     List<String> targetUserIds1 = users1.stream().map(User::getId).distinct().collect(Collectors.toList());
-                    targetUserIds1.add("-1");
+                    targetUserIds1.add(user.getId());
                     customLambdaQueryWrapper.in(Custom::getCreatorId,targetUserIds1);
                     contactsLambdaQueryWrapper.in(Contacts::getCreatorId,targetUserIds1);
                     businessOpportunityLambdaQueryWrapper.in(BusinessOpportunity::getCreatorId,targetUserIds1);

+ 2 - 1
fhKeeper/formulahousekeeper/management-crm/src/main/resources/mapper/ProductMapper.xml

@@ -23,11 +23,12 @@
         <result column="plate5" property="plate5" />
         <result column="descs" property="descs" />
         <result column="is_delete" property="isDelete" />
+        <result column="update_time" property="updateTime" />
     </resultMap>
 
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
-        id, company_id, product_name, product_code, type, unit, price, inventory, status, incharger_id, create_time, creator_id, plate1, plate2, plate3, plate4, plate5, descs, is_delete
+        id, company_id, product_name, product_code, type, unit, price, inventory, status, incharger_id, create_time, creator_id, plate1, plate2, plate3, plate4, plate5, descs, is_delete, update_time
     </sql>
 
 </mapper>

+ 2 - 1
fhKeeper/formulahousekeeper/management-crm/src/main/resources/mapper/SalesOrderMapper.xml

@@ -32,11 +32,12 @@
         <result column="plate3" property="plate3" />
         <result column="plate4" property="plate4" />
         <result column="plate5" property="plate5" />
+        <result column="update_time" property="updateTime" />
     </resultMap>
 
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
-        id, company_id, order_name, order_code, custom_id, business_opportunity_id, price, contacts_id, type, place_time, order_start_date, order_end_date, received_payment, un_received_payment, received_status, custom_signer, company_signer, incharger_id, remark, create_time, creator_id, is_delete, status, plate1, plate2, plate3, plate4, plate5
+        id, company_id, order_name, order_code, custom_id, business_opportunity_id, price, contacts_id, type, place_time, order_start_date, order_end_date, received_payment, un_received_payment, received_status, custom_signer, company_signer, incharger_id, remark, create_time, creator_id, is_delete, status, plate1, plate2, plate3, plate4, plate5, update_time
     </sql>
 
 </mapper>

+ 3 - 3
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ReportController.java

@@ -1061,11 +1061,11 @@ public class ReportController {
                                     .setSubProjectId(subProjectId[i])
                                     .setGroupId(groupId[i])
                                     .setReportTimeType(reportTimeType[i])
-                                    .setMultiWorktime(multiWorktime[i])
-                                    .setContent(content[i])
+                                    .setMultiWorktime(multiWorktime.length > 0?multiWorktime[i]:0)
+                                    .setContent(content.length > 0?content[i]:"-")
                                     .setDegreeId(degreeId.length > 0?degreeId[i]:null)
                                     .setCustomData(customData[i])
-                                    .setStage(stage[i])
+                                    .setStage(stage != null && stage.length>0?stage[i]:"-")
 //                                    .setState(auditWorkflowList.size() == 0?1:0)//代填的如果没有自定义审核流程就直接审核通过了
                                     .setCompanyId(user.getCompanyId())
                                     .setPicAdd(pics!=null?pics[i]:null)

+ 7 - 2
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/TimeType.java

@@ -17,7 +17,7 @@ import lombok.experimental.Accessors;
  * </p>
  *
  * @author Seyason
- * @since 2024-06-06
+ * @since 2024-06-22
  */
 @Data
 @EqualsAndHashCode(callSuper = false)
@@ -584,6 +584,12 @@ public class TimeType extends Model<TimeType> {
     @TableField("alert_check_msg")
     private String alertCheckMsg;
 
+    /**
+     * 导入的日报,按照正常审批来处理,非单独设置的部门直属领导审核
+     */
+    @TableField("import_report_audit_normal")
+    private Integer importReportAuditNormal;
+
 
     @TableField(exist = false)
     private List<User> userList;
@@ -592,7 +598,6 @@ public class TimeType extends Model<TimeType> {
     @TableField(exist = false)
     private Integer saasSyncContact;
 
-
     @Override
     protected Serializable pkVal() {
         return this.companyId;

+ 65 - 7
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java

@@ -5299,12 +5299,32 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                             report.setContent(workContent);
                             report.setMultiWorktime(timeType.getMultiWorktime());
                             report.setFillUserid(user.getId());
-                            if (timeType.getNeedDeptAudit() == 0) {
-                                report.setState(1);//导入的直接算审核通过
+                            if (timeType.getImportReportAuditNormal() == 0) {
+                                //老的导入日报审核模式
+                                if (timeType.getNeedDeptAudit() == 0) {
+                                    report.setState(1);//导入的直接算审核通过
+                                } else {
+                                    report.setState(-1);//待部门上级审核员审核
+                                    report.setDepartmentAuditState(1);//部门已审核,到上层领导审核
+                                }
                             } else {
-                                report.setState(-1);//待部门上级审核员审核
-                                report.setDepartmentAuditState(1);//部门已审核,到上层领导审核
+                                report.setState(0);//待审核
+                                //目前仅支持项目审核人审核的模式,叠加审批流
+                                if (timeType.getReportAuditType() == 0) {
+                                    //设置日报审核人
+                                    List<ProjectAuditor> projectAuditors = projectAuditorMapper.selectList(new QueryWrapper<ProjectAuditor>().eq("project_id", project.getId()));
+                                    if (projectAuditors.size() > 0) {
+                                        report.setProjectAuditorId(projectAuditors.get(0).getAuditorId());
+                                    }
+
+                                    List<AuditWorkflowTimeSetting> auditWorkflowList
+                                            = auditWorkflowTimeSettingMapper.selectList(
+                                            new QueryWrapper<AuditWorkflowTimeSetting>().eq("dept_id", reportCreator.getDepartmentId()).orderByAsc("seq"));
+                                    List<Department> allDeptList = departmentMapper.selectList(new QueryWrapper<Department>().eq("company_id", reportCreator.getCompanyId()));
+                                    setReportWorkflowAuditor(auditWorkflowList, allDeptList, report,timeType);
+                                }
                             }
+
                             report.setCreateDate(LocalDate.parse(reportDate, dtf));
                             report.setCost(reportCreator.getCost()==null?new BigDecimal(0) : reportCreator.getCost().multiply(new BigDecimal(time)));
                             reportList.add(report);
@@ -5317,9 +5337,15 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
             }
 
             if (reportList.size() > 0) {
+                int shouldSkipPassData = 0;
+                if (timeType.getImportReportAuditNormal() == 1) {
+                    shouldSkipPassData = 1;
+                } else {
+                    shouldSkipPassData = timeType.getNeedDeptAudit();
+                }
                 //依赖于对是否需要部门审核的判断,如果不需要则认为导入的就是审核通过的,重新导入就直接覆盖之前的。
-                reportMapper.deleteUserSameDayReport(companyId, reportList, timeType.getNeedDeptAudit());
-                if (timeType.getNeedDeptAudit() == 1) {
+                reportMapper.deleteUserSameDayReport(companyId, reportList, shouldSkipPassData);
+                if (shouldSkipPassData == 1) {
                     //如果需要导入审核,则对审核通过的进行排除
                     List<Map> passReports = reportMapper.getSameDayPassReport(companyId, reportList);
                     StringBuilder sb = new StringBuilder();
@@ -5421,7 +5447,39 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
         return msg;
     }
 
-
+    private void setReportWorkflowAuditor(List<AuditWorkflowTimeSetting> auditWorkflowList, List<Department> allDeptList, Report report, TimeType comTimeType) {
+        if (auditWorkflowList.size() == 0) {
+            //没有自定义审核流,默认的直接是项目负责人审核
+            report.setIsDeptAudit(0);
+            report.setIsFinalAudit(1);
+        } else {
+            //取第一个审核节点
+            AuditWorkflowTimeSetting firstNode = auditWorkflowList.get(0);
+            report.setIsFinalAudit(auditWorkflowList.size() > 1?0:1);
+            report.setIsDeptAudit(firstNode.getIsDeptAudit());
+            report.setAuditDeptid(firstNode.getAuditDeptId());
+            if (firstNode.getIsDeptAudit() == 1) {
+                Department curDept = allDeptList.stream()
+                        .filter(ad->ad.getDepartmentId().equals(firstNode.getAuditDeptId())).findFirst().get();
+                String curDeptManagerId = curDept.getManagerId();
+                //启用了本部门负责人的日报由上级部门主要负责人审核
+                if (comTimeType.getReportAuditFlowEnableSuperDeptAduit() == 1 && curDeptManagerId.equals(report.getCreatorId())) {
+                    //当前提交的人是这个部门的主要负责人,那么要取该部门的上一级部门的主要负责人来审核
+                    Integer parentDeptId = curDept.getSuperiorId();
+                    if (parentDeptId == null) {
+                        //没有上级部门,直接取当前部门的负责人
+                        report.setAuditDeptManagerid(curDeptManagerId);
+                    } else {
+//                        report.setAuditDeptid(parentDeptId);
+                        report.setAuditDeptManagerid(allDeptList.stream()
+                                .filter(ad->ad.getDepartmentId().equals(parentDeptId)).findFirst().get().getManagerId());
+                    }
+                } else {
+                    report.setAuditDeptManagerid(curDeptManagerId);
+                }
+            }
+        }
+    }
     private void fillDeptUser(List<DepartmentVO> list, List<HashMap> userList) {
         list.forEach(l->{
             List<HashMap> collect = userList.stream().filter(u -> u.get("departmentId").equals(l.getId())).collect(Collectors.toList());

+ 1 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ReportMapper.xml

@@ -389,7 +389,7 @@
             <foreach collection="deptIds" item="deptId" separator="," close=")" open="(" index="index">
                 #{deptId}
             </foreach>
-        or a.creator_id=#{viewerId})
+        or a.creator_id=#{viewUserId})
         </if>
         ORDER BY a.creator_id, a.create_date desc
     </select>

Файловите разлики са ограничени, защото са твърде много
+ 2 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/TimeTypeMapper.xml


+ 13 - 0
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/PlanController.java

@@ -171,5 +171,18 @@ public class PlanController {
     public HttpRespMsg deletePlan(Integer id){
         return planService.deletePlan(id);
     }
+
+
+    /**
+    * @Description:拒收导致的数据丢失修复
+    * @Param: []
+    * @return: com.management.platform.util.HttpRespMsg
+    * @Author: yurk
+    * @Date: 2024/6/20
+    */
+    @RequestMapping("/updateHasDeleteTeamData")
+    public HttpRespMsg updateHasDeleteTeamData(){
+        return reportService.updateHasDeleteTeamData();
+    }
 }
 

+ 25 - 2
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/ProductController.java

@@ -1,6 +1,7 @@
 package com.management.platform.controller;
 
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.management.platform.entity.Product;
 import com.management.platform.mapper.UserMapper;
 import com.management.platform.service.PlanService;
@@ -15,6 +16,11 @@ import org.springframework.web.multipart.MultipartFile;
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
 import javax.validation.Valid;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
 
 /**
  * <p>
@@ -38,8 +44,8 @@ public class ProductController {
     PlanService planService;
 
     @RequestMapping("/getProductPage")
-    public HttpRespMsg getProductPage(Integer cateId, @RequestParam Integer pageIndex, @RequestParam Integer pageSize, String name, String code,@RequestParam(defaultValue = "0")Integer status) {
-        return productService.getProductPage(cateId, pageIndex, pageSize, name, code,status, request);
+    public HttpRespMsg getProductPage(Integer cateId, @RequestParam Integer pageIndex, @RequestParam Integer pageSize, String name, String code,@RequestParam(defaultValue = "0")Integer status,String projectName) {
+        return productService.getProductPage(cateId, pageIndex, pageSize, name, code,status,projectName, request);
     }
 
     @RequestMapping("/saveProductInfo")
@@ -109,5 +115,22 @@ public class ProductController {
         }
         return msg;
     }
+
+    @RequestMapping("/getProductProjectNames")
+    public HttpRespMsg getProductProjectNames(String value){
+        HttpRespMsg msg=new HttpRespMsg();
+        Integer companyId = userMapper.selectById(request.getHeader("token")).getCompanyId();
+        List<Product> list = productService.list(new LambdaQueryWrapper<Product>().like(Product::getProjectName, value).eq(Product::getCompanyId,companyId));
+        List<String> stringList = list.stream().map(Product::getProjectName).distinct().collect(Collectors.toList());
+        List<Map<String,Object>> mapList=new ArrayList<>();
+        for (int i = 0; i < stringList.size(); i++) {
+            Map<String,Object> map=new HashMap<>();
+            map.put("label",i);
+            map.put("value",stringList.get(i));
+            mapList.add(map);
+        }
+        msg.setData(mapList);
+        return msg;
+    }
 }
 

+ 5 - 0
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/ReportController.java

@@ -1541,6 +1541,11 @@ public class ReportController {
         return reportService.getPersonWorkHoursWagesDetail(date,userId,startDate,endDate);
     }
 
+    @RequestMapping("getPersonWorkHoursWagesDetailForTemp")
+    public HttpRespMsg getPersonWorkHoursWagesDetailForTemp(String date,String userId,String startDate,String endDate){
+        return reportService.getPersonWorkHoursWagesDetailForTemp(date,userId,startDate,endDate);
+    }
+
     @RequestMapping("getPersonWorkHoursWagesDetailForMob")
     public HttpRespMsg getPersonWorkHoursWagesDetailForMob(String date,String userId,String startDate,String endDate,Integer checkStatus,Integer detailStatus){
         return reportService.getPersonWorkHoursWagesDetailForMob(date,userId,startDate,endDate,checkStatus,detailStatus);

+ 214 - 9
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/WxCorpInfoController.java

@@ -5,25 +5,24 @@ import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.management.platform.entity.LeaveSheet;
-import com.management.platform.entity.User;
-import com.management.platform.entity.WxCorpInfo;
+import com.management.platform.entity.*;
 import com.management.platform.mapper.UserMapper;
-import com.management.platform.service.LeaveSheetService;
-import com.management.platform.service.WxCorpInfoService;
+import com.management.platform.service.*;
 import com.management.platform.util.DateTimeUtil;
 import com.management.platform.util.HttpRespMsg;
+import org.springframework.http.*;
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.client.RestTemplate;
 
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.time.LocalDate;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Optional;
+import java.time.LocalDateTime;
+import java.util.*;
 
 /**
  * <p>
@@ -43,6 +42,16 @@ public class WxCorpInfoController {
     UserMapper userMapper;
     @Resource
     LeaveSheetService leaveSheetService;
+    @Resource
+    ReportService reportService;
+    @Resource
+    WxCorpTemplateService wxCorpTemplateService;
+    @Resource
+    DepartmentService departmentService;
+    @Resource
+    TaskTypeService taskTypeService;
+    @Resource
+    PlanService planService;
 
     @RequestMapping("/testDownload")
     public HttpRespMsg testDownload() {
@@ -94,6 +103,7 @@ public class WxCorpInfoController {
 
 
     @RequestMapping("/testGetApprovalList")
+    @Transactional
     public HttpRespMsg testGetApprovalList(String startDate,String endDate) throws Exception {
         HttpRespMsg msg=new HttpRespMsg();
         JSONArray jsonArrayFilter = new JSONArray();
@@ -197,8 +207,203 @@ public class WxCorpInfoController {
         return msg;
     }
 
-    public static void main(String[] args) {
+    @RequestMapping("/testSyncTemporaryJobApplication")
+    @Transactional
+    public HttpRespMsg testSyncTemporaryJobApplication(String startDate,String endDate)throws Exception{
+        HttpRespMsg msg=new HttpRespMsg();
+        JSONArray jsonArrayFilter = new JSONArray();
+        JSONObject filter1 = new JSONObject();
+        WxCorpTemplate template = wxCorpTemplateService.getById(7);
+        filter1.put("key","template_id");
+        filter1.put("value",template.getTemplateId());
+        jsonArrayFilter.add(filter1);
+        JSONObject filter2 = new JSONObject();
+        filter2.put("key","sp_status");
+        filter2.put("value",2);
+        jsonArrayFilter.add(filter2);
+        List<String> approvalInfo = wxCorpInfoService.getApprovalInfo(7, startDate, endDate, "", jsonArrayFilter);
+        List<Department> departmentList = departmentService.list(new LambdaQueryWrapper<Department>().eq(Department::getCompanyId, 7));
+        List<TaskType> taskTypeList = taskTypeService.list(new LambdaQueryWrapper<TaskType>().eq(TaskType::getCompanyId, 7));
+        List<User> userList = userMapper.selectList(new LambdaQueryWrapper<User>().eq(User::getCompanyId,7));
+        if(approvalInfo!=null){
+            for (int i = 0; i < approvalInfo.size(); i++) {
+                String codeNum = approvalInfo.get(i);
+                String approvalInfoDetailResp = wxCorpInfoService.getApprovalInfoDetail(7, codeNum);
+                JSONObject approvalInfoDetail = JSONObject.parseObject(approvalInfoDetailResp);
+                JSONObject info = approvalInfoDetail.getJSONObject("info");
+                JSONObject applyer = info.getJSONObject("applyer");
+                String userid = applyer.getString("userid");
+                Optional<User> first = userList.stream().filter(u ->u.getCorpwxRealUserid()!=null&&u.getCorpwxRealUserid().equals(userid)).findFirst();
+                if(!first.isPresent()){
+                    continue;
+                }
+                JSONObject apply_data = info.getJSONObject("apply_data");
+                System.out.println("获取到的单据信息===========>"+apply_data);
+                JSONArray contents = apply_data.getJSONArray("contents");
+                //生成 车间插单计划
+                Plan plan=new Plan();
+                plan.setCompanyId(7);
+                plan.setCreateTime(LocalDateTime.now());
+                plan.setPlanType(1);
+                plan.setCreateId(first.get().getId());
+                //参与人员列表
+                List<String> userTeams=new ArrayList<>();
+                //初始化 单价(元/小时)
+                BigDecimal price=new BigDecimal(0);
+                //初始化 工作时长
+                double workTime=0;
+                //初始话 工作日期
+                JSONArray sp_record = info.getJSONArray("sp_record");
+                //获取最后一个审批节点
+                JSONObject last_sp_record = sp_record.getJSONObject(sp_record.size() - 1);
+                JSONArray details = last_sp_record.getJSONArray("details");
+                //获取最后详情
+                JSONObject lastDetail = details.getJSONObject(details.size() - 1);
+                long sptime = lastDetail.getLongValue("sptime");
+                LocalDate createDate=LocalDate.now();
+                //初始化工位
+                Integer deptId=0;
+                for (int i1 = 0; i1 < contents.size(); i1++) {
+                    JSONObject map = contents.getJSONObject(i1);
+                    JSONArray title = map.getJSONArray("title");
+                    JSONObject value = map.getJSONObject("value");
+                    String control = map.getString("control");
+                    if(title.getJSONObject(0).getString("text").equals("临时报工分类")){
+                        if(control.equals("Selector")){
+                            JSONObject selector = value.getJSONObject("selector");
+                            JSONArray options = selector.getJSONArray("options");
+                            JSONObject object = options.getJSONObject(0);
+                            JSONArray value1 = object.getJSONArray("value");
+                            JSONObject jsonObject = value1.getJSONObject(0);
+                            String text = jsonObject.getString("text");
+                            Optional<TaskType> first1 = taskTypeList.stream().filter(t -> t.getTaskTypeName().equals(text)).findFirst();
+                            if(first1.isPresent()){
+                                plan.setTaskTypeId(first1.get().getId());
+                                plan.setTaskTypeName(first1.get().getTaskTypeName());
+                            }
+                        }
+                    }
+                    if(title.getJSONObject(0).getString("text").equals("事由")){
+                        if(control.equals("Text")||control.equals("Textarea")){
+                            String text = value.getString("text");
+                            plan.setTaskName(text);
+                        }
+                    }
+                    //先处理多个人员 公用此单据非工时部分内容
+                    if(title.getJSONObject(0).getString("text").equals("参与人员")){
+                        if(control.equals("Contact")){
+                            JSONArray members = value.getJSONArray("members");
+                            for (int i2 = 0; i2 < members.size(); i2++) {
+                                JSONObject jsonObject = members.getJSONObject(i2);
+                                String userid1 = jsonObject.getString("userid");
+                                userTeams.add(userid1);
+                            }
+
+                        }
+                    }
+                    if(title.getJSONObject(0).getString("text").equals("参与人数")){
+                        if(control.equals("Number")){
+                            int new_number = value.getIntValue("new_number");
+                            plan.setPlanManNum(new_number);
+                        }
+                    }
+                    if(title.getJSONObject(0).getString("text").equals("开始时间")){
+                        if(control.equals("Date")){
+                            JSONObject date = value.getJSONObject("date");
+                            long s_timestamp = date.getLongValue("s_timestamp");
+                            LocalDate localDateFromUnix = DateTimeUtil.getLocalDateFromUnix(s_timestamp);
+                            plan.setStartDate(localDateFromUnix);
+                            if(sptime>0){
+                                createDate= DateTimeUtil.getLocalDateFromUnix(sptime);
+                            }else {
+                                createDate=localDateFromUnix;
+                            }
 
+                        }
+                    }
+                    if(title.getJSONObject(0).getString("text").equals("结束时间")){
+                        if(control.equals("Date")){
+                            JSONObject date = value.getJSONObject("date");
+                            long s_timestamp = date.getLongValue("s_timestamp");
+                            LocalDate localDateFromUnix = DateTimeUtil.getLocalDateFromUnix(s_timestamp);
+                            plan.setEndDate(localDateFromUnix);
+                            if(sptime>0){
+                                createDate= DateTimeUtil.getLocalDateFromUnix(sptime);
+                            }else {
+                                createDate=localDateFromUnix;
+                            }
+                        }
+                    }
+                    if(title.getJSONObject(0).getString("text").equals("工作时长")){
+                        if(control.equals("Number")){
+                            double new_number = value.getDoubleValue("new_number");
+                            workTime=new_number;
+                        }
+                    }
+                    BigDecimal bigDecimal = new BigDecimal(plan.getPlanManNum()==null?0:plan.getPlanManNum());
+                    //工时以分钟为单位 *60
+                    bigDecimal=bigDecimal.multiply(new BigDecimal(workTime));
+                    bigDecimal=bigDecimal.multiply(new BigDecimal(60));
+                    plan.setPlanWorkHour(bigDecimal.doubleValue());
+                    if(title.getJSONObject(0).getString("text").equals("所属工位")){
+                        if(control.equals("Contact")){
+                            JSONArray departments = value.getJSONArray("departments");
+                            String openapi_id = departments.getJSONObject(0).getString("openapi_id");
+                            Optional<Department> first1 = departmentList.stream().filter(d -> d.getCorpwxDeptid().equals(Integer.valueOf(openapi_id))).findFirst();
+                            if(first1.isPresent()){
+                                plan.setStationId(first1.get().getDepartmentId());
+                                plan.setStationName(first1.get().getDepartmentName());
+                                plan.setForemanId(first1.get().getManagerId());
+                                Optional<User> first2 = userList.stream().filter(u -> u.getId().equals(first1.get().getManagerId())).findFirst();
+                                if(first2.isPresent()){
+                                    plan.setForemanName(first2.get().getName());
+                                }
+                                deptId=first1.get().getDepartmentId();
+                            }
+                        }
+                    }
+                    if(title.getJSONObject(0).getString("text").contains("单价")){
+                        if(control.equals("Number")){
+                            Double new_money = value.getDouble("new_number");
+                            plan.setMoneyOfJob(new BigDecimal(new_money));
+                            price=new BigDecimal(new_money);
+                        }
+                    }
+                    if(title.getJSONObject(0).getString("text").equals("备注")){
+                        if(control.equals("Text")||control.equals("Textarea")){
+                            String text = value.getString("text");
+                            plan.setDescribtion(text);
+                        }
+                    }
+                }
+                planService.save(plan);
+                List<Report> reportList=new ArrayList<>();
+                //处理人员日报数据
+                for (String userTeam : userTeams) {
+                    Optional<User> user = userList.stream().filter(u -> u.getCorpwxRealUserid() != null && u.getCorpwxRealUserid().equals(userTeam)).findFirst();
+                    if(user.isPresent()){
+                        Report report=new Report();
+                        report.setCreateDate(createDate);
+                        report.setCreatorId(user.get().getId());
+                        report.setCreateTime(LocalDateTime.now());
+                        BigDecimal bigDecimal = new BigDecimal(workTime);
+                        bigDecimal=bigDecimal.multiply(price);
+                        report.setCost(bigDecimal);
+                        report.setWorkingTime(workTime);
+                        report.setStatus(2);
+                        report.setPlanId(plan.getId());
+                        report.setCompanyId(7);
+                        report.setDeptId(deptId);
+                        reportList.add(report);
+                    }
+                }
+                if(reportList.size()>0){
+                    reportService.saveBatch(reportList);
+                }
+            }
+        }
+        msg.setData(approvalInfo);
+        return msg;
     }
 }
 

+ 21 - 0
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/WxCorpTemplateController.java

@@ -0,0 +1,21 @@
+package com.management.platform.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2024-06-19
+ */
+@RestController
+@RequestMapping("/wx-corp-template")
+public class WxCorpTemplateController {
+
+}
+

+ 2 - 0
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/entity/LeaveSheet.java

@@ -149,6 +149,8 @@ public class LeaveSheet extends Model<LeaveSheet> {
     @TableField("cur_audit_setting_id")
     private Integer curAuditSettingId;
 
+    public static String[] leaveTypes= {"事假","病假","年假","产假","婚假","丧假","调休","陪产假","其他"};
+
 
     @Override
     protected Serializable pkVal() {

+ 7 - 1
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/entity/Product.java

@@ -15,7 +15,7 @@ import lombok.experimental.Accessors;
  * </p>
  *
  * @author Seyason
- * @since 2024-06-03
+ * @since 2024-06-19
  */
 @Data
 @EqualsAndHashCode(callSuper = false)
@@ -57,6 +57,12 @@ public class Product extends Model<Product> {
     @TableField("code")
     private String code;
 
+    /**
+     * 项目名称
+     */
+    @TableField("project_name")
+    private String projectName;
+
     /**
      * 编组
      */

+ 3 - 0
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/entity/User.java

@@ -319,6 +319,9 @@ public class User extends Model<User> {
     @TableField(exist = false)
     private String  totalSurplusResult;
 
+    @TableField(exist = false)
+    private String  totalTempResult;
+
     @Override
     protected Serializable pkVal() {
         return this.id;

+ 47 - 0
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/entity/WxCorpTemplate.java

@@ -0,0 +1,47 @@
+package com.management.platform.entity;
+
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableField;
+import java.io.Serializable;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author Seyason
+ * @since 2024-06-19
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+public class WxCorpTemplate extends Model<WxCorpTemplate> {
+
+    private static final long serialVersionUID=1L;
+
+    @TableId("company_id")
+    private Integer companyId;
+
+    /**
+     * 审批模板id
+     */
+    @TableField("template_id")
+    private String templateId;
+
+    /**
+     * 0-立项审批
+     */
+    @TableField("type")
+    private Integer type;
+
+
+    @Override
+    protected Serializable pkVal() {
+        return this.companyId;
+    }
+
+}

+ 1 - 0
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/entity/vo/ReportVO.java

@@ -25,5 +25,6 @@ public class ReportVO extends Report {
     private String planType; //生产计划类型, 0-普通计划,1-插单计划
     private LocalDate startDate;
     private LocalDate  endDate;
+    private Integer  seq;
 
 }

+ 2 - 0
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/mapper/ReportMapper.java

@@ -221,4 +221,6 @@ public interface ReportMapper extends BaseMapper<Report> {
             "LEFT JOIN prod_procedure ON prod_procedure.id = report.`prod_procedure_id`\n" +
             "WHERE plan.`create_time` > '2024-01-01' AND report.`finish_num` > 0 AND ABS(report.`finish_num`/plan.`num`- report.`cost`/plan_procedure_total.`total_wages`) > 0.001")
     List<Map<String, Object>> findFinishNumErrorData();
+
+    List<Map<String, Object>> getPersonWorkHoursWagesDetailForTemp(String date, String userId, Integer companyId, String startDate, String endDate);
 }

+ 16 - 0
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/mapper/WxCorpTemplateMapper.java

@@ -0,0 +1,16 @@
+package com.management.platform.mapper;
+
+import com.management.platform.entity.WxCorpTemplate;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author Seyason
+ * @since 2024-06-19
+ */
+public interface WxCorpTemplateMapper extends BaseMapper<WxCorpTemplate> {
+
+}

+ 1 - 1
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/service/ProductService.java

@@ -17,7 +17,7 @@ import javax.servlet.http.HttpServletRequest;
  */
 public interface ProductService extends IService<Product> {
 
-    HttpRespMsg getProductPage(Integer cateId, Integer pageIndex, Integer pageSize, String name, String code,Integer status, HttpServletRequest request);
+    HttpRespMsg getProductPage(Integer cateId, Integer pageIndex, Integer pageSize, String name, String code,Integer status,String projectName, HttpServletRequest request);
 
     HttpRespMsg saveProductInfo(Product product, HttpServletRequest request);
 

+ 4 - 0
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/service/ReportService.java

@@ -162,4 +162,8 @@ public interface ReportService extends IService<Report> {
     HttpRespMsg fixFinishNumData();
 
     HttpRespMsg getPersonWorkHoursWagesDetailForMob(String date, String userId, String startDate, String endDate,Integer checkStatus,Integer detailStatus);
+
+    HttpRespMsg getPersonWorkHoursWagesDetailForTemp(String date, String userId, String startDate, String endDate);
+
+    HttpRespMsg updateHasDeleteTeamData();
 }

+ 2 - 0
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/service/WxCorpInfoService.java

@@ -83,5 +83,7 @@ public interface WxCorpInfoService extends IService<WxCorpInfo> {
 
     List<String> getApprovalInfo(Integer companyId, String startDate, String endDate,String newCursor, JSONArray jsonArrayFilter) throws Exception;
 
+    String getTemplateDetail(Integer companyId) throws Exception;
+
     String getApprovalInfoDetail(Integer companyId, String spNo) throws Exception;
 }

+ 16 - 0
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/service/WxCorpTemplateService.java

@@ -0,0 +1,16 @@
+package com.management.platform.service;
+
+import com.management.platform.entity.WxCorpTemplate;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author Seyason
+ * @since 2024-06-19
+ */
+public interface WxCorpTemplateService extends IService<WxCorpTemplate> {
+
+}

+ 3 - 0
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/service/impl/PlanProcedureTotalServiceImpl.java

@@ -101,6 +101,7 @@ public class PlanProcedureTotalServiceImpl extends ServiceImpl<PlanProcedureTota
             procedureMap.put("checker_id", map.get("checker_id"));
             procedureMap.put("check_type", map.get("check_type"));
             procedureMap.put("plan_check_type", map.get("plan_check_type"));
+            procedureMap.put("seq", map.get("seq"));
             procedureList.add(procedureMap);
         }
 
@@ -222,6 +223,8 @@ public class PlanProcedureTotalServiceImpl extends ServiceImpl<PlanProcedureTota
             Integer planNum = (Integer)prodProcedureTeam.get("num");
             double remainNum = planNum - allFileProcNum;
             if (remainNum < 0) remainNum = 0;
+            //四舍五入,精确到小数点后2位
+            remainNum = (double)Math.round(remainNum*100)/100;
             prodProcedureTeam.put("num", remainNum);
 
             Stream<String> sorted = list.stream().distinct().sorted();

+ 10 - 10
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/service/impl/PlanServiceImpl.java

@@ -14,6 +14,7 @@ import com.management.platform.util.DateTimeUtil;
 import com.management.platform.util.ExcelUtil;
 import com.management.platform.util.HttpRespMsg;
 import com.management.platform.util.MessageUtils;
+import com.sun.org.apache.regexp.internal.RE;
 import org.apache.poi.EncryptedDocumentException;
 import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
 import org.apache.poi.ss.usermodel.CellType;
@@ -340,13 +341,7 @@ public class PlanServiceImpl extends ServiceImpl<PlanMapper, Plan> implements Pl
             TaskType taskType = taskTypeMapper.selectById(plan.getTaskTypeId());
             plan.setTaskTypeName(taskType.getTaskTypeName());
         }
-        List<ProdProcedure> procedureList = prodProcedureMapper.selectList(
-                new QueryWrapper<ProdProcedure>()
-                        .lambda()
-                        .eq(plan.getProductId() != null, ProdProcedure::getProductId, plan.getProductId())
-                        .eq(user.getCompanyId()!=null,ProdProcedure::getCompanyId,user.getCompanyId()).orderByAsc(ProdProcedure::getSeq)
-
-        );
+        List<ProdProcedure> procedureList = prodProcedureMapper.selectList(new QueryWrapper<ProdProcedure>().eq("company_id", companyId).eq("product_id",plan.getProductId()).orderByDesc("id"));
         if(plan.getPlanType()==0){
             if(procedureList.size()<=0){
                 msg.setError("当前产品工序配置未完成,请先完成工序配置");
@@ -357,7 +352,7 @@ public class PlanServiceImpl extends ServiceImpl<PlanMapper, Plan> implements Pl
         List<PlanProcedureTotal> oldPlanProcedureTotals=new ArrayList<>();
         List<ProdProcedure> list;
         if(plan.getId()==null){
-            list = procedureList.stream().filter(pl -> pl.getVersionNumber().equals(procedureList.get(procedureList.size()-1).getVersionNumber())).collect(Collectors.toList());
+            list = procedureList.stream().filter(pl -> pl.getVersionNumber().equals(procedureList.get(0).getVersionNumber())).collect(Collectors.toList());
             if(plan.getProductSchedulingNum()!=null){
                 if(count(new QueryWrapper<Plan>().eq("product_scheduling_num",plan.getProductSchedulingNum()))>0){
                     msg.setError("当前排产工单号已存在");
@@ -389,8 +384,8 @@ public class PlanServiceImpl extends ServiceImpl<PlanMapper, Plan> implements Pl
             }else {
                 plan.setPlanType(1);
             }
-            if(procedureList!=null&&procedureList.size()>0){
-                String versionNumber = procedureList.get(0).getVersionNumber();
+            if(list!=null&&list.size()>0){
+                String versionNumber = list.get(0).getVersionNumber();
                 plan.setVersionNumber(versionNumber);
             }
             if(planMapper.insert(plan)<0){
@@ -1197,6 +1192,11 @@ public class PlanServiceImpl extends ServiceImpl<PlanMapper, Plan> implements Pl
         }
         List<String> idList =new ArrayList<>(Arrays.asList(ids.split(",")));
         idList.add("-1");
+        List<Report> reports = reportMapper.selectList(new LambdaQueryWrapper<Report>().in(Report::getUserProcedureTeamId, idList));
+        if(reports.size()>0){
+            msg.setError("存在以报工计划,无法拒收");
+            return msg;
+        }
         if(!prodProcedureTeamService.removeByIds(idList)){
             msg.setError("验证失败");
         }

+ 70 - 51
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/service/impl/ProductServiceImpl.java

@@ -73,7 +73,7 @@ public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> impl
     private ExcelExportService excelExportService;
 
     @Override
-    public HttpRespMsg getProductPage(Integer cateId, Integer pageIndex, Integer pageSize, String name, String code,Integer status, HttpServletRequest request) {
+    public HttpRespMsg getProductPage(Integer cateId, Integer pageIndex, Integer pageSize, String name, String code,Integer status,String projectName, HttpServletRequest request) {
         QueryWrapper<Product> queryWrapper = new QueryWrapper<>();
         if (cateId != null) {
             queryWrapper.eq("category_id",cateId);
@@ -84,6 +84,9 @@ public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> impl
         if (!StringUtils.isEmpty(code)) {
             queryWrapper.like("code",code);
         }
+        if(!StringUtils.isEmpty(projectName)){
+            queryWrapper.like("project_name",projectName);
+        }
         queryWrapper.eq("status",status);
         User user = userMapper.selectById(request.getHeader("Token"));
         queryWrapper.eq("company_id",user.getCompanyId()).orderByDesc("id");
@@ -113,52 +116,48 @@ public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> impl
 
         product.setCompanyId(user.getCompanyId());
 
-        Integer count = productMapper.selectCount(new LambdaQueryWrapper<Product>()
-                .eq(user.getCompanyId() != null, Product::getCompanyId, user.getCompanyId())
-                .eq(!StringUtils.isEmpty(product.getName()), Product::getName, product.getName())
-        );
+        Integer count ;
+        if(product.getId()==null){
+            count = productMapper.selectCount(new LambdaQueryWrapper<Product>()
+                    .eq(user.getCompanyId() != null, Product::getCompanyId, user.getCompanyId())
+                    .eq(!StringUtils.isEmpty(product.getName()), Product::getName, product.getName()).eq(Product::getProjectName,product.getProjectName())
+            );
+        }else {
+            count = productMapper.selectCount(new LambdaQueryWrapper<Product>()
+                    .ne(Product::getId,product.getId()).eq(user.getCompanyId() != null, Product::getCompanyId, user.getCompanyId())
+                    .eq(!StringUtils.isEmpty(product.getName()), Product::getName, product.getName()).eq(Product::getProjectName,product.getProjectName())
+            );
+        }
+        if(count>0){
+            msg.setError("项目名称["+product.getProjectName()+"]下产品名重复");
+            return msg;
+        }
         if (product.getId() == null) {
-            //新增
-            if(count==0){
-                productMapper.insert(product);
-
-            }else{
-                msg.setError("产品名重复");
-            }
+            productMapper.insert(product);
         } else {
-            //修改
-            if(count<2){
-                productMapper.updateById(product);
-
-                //修改对应工序中产品的名字
-                ProdProcedure prodProcedure=new ProdProcedure();
-                prodProcedure.setProductName(product.getName());
-                prodProcedureService.update(prodProcedure,
-                        new LambdaQueryWrapper<ProdProcedure>()
-                                .eq(product.getId()!=null,ProdProcedure::getProductId,product.getId())
-                                .eq(user.getCompanyId() != null, ProdProcedure::getCompanyId, user.getCompanyId())
-                );
-                //修改相关计划下 产品名称以及编码
-                List<Plan> planList = planMapper.selectList(new LambdaQueryWrapper<Plan>().eq(Plan::getProductId, product.getId()));
-                planList.forEach(p->{
-                    p.setProductId(product.getId());
-                    p.setProductName(product.getName());
-                    p.setProjectCode(product.getCode());
-                });
-                if(planList.size()>0){
-                    planService.updateBatchById(planList);
-                }
-            }else{
-                msg.setError("产品名重复");
+            productMapper.updateById(product);
+            //修改对应工序中产品的名字
+            ProdProcedure prodProcedure=new ProdProcedure();
+            prodProcedure.setProductName(product.getName());
+            prodProcedureService.update(prodProcedure,
+                    new LambdaQueryWrapper<ProdProcedure>()
+                            .eq(product.getId()!=null,ProdProcedure::getProductId,product.getId())
+                            .eq(user.getCompanyId() != null, ProdProcedure::getCompanyId, user.getCompanyId())
+            );
+            //修改相关计划下 产品名称以及编码
+            List<Plan> planList = planMapper.selectList(new LambdaQueryWrapper<Plan>().eq(Plan::getProductId, product.getId()));
+            planList.forEach(p->{
+                p.setProductId(product.getId());
+                p.setProductName(product.getName());
+                p.setProjectCode(product.getCode());
+                p.setProjectName(product.getProjectName());
+            });
+            if(planList.size()>0){
+                planService.updateBatchById(planList);
             }
-
         }
-
         System.out.println(product);
         msg.setData(product);
-
-
-
         return msg;
     }
 
@@ -231,6 +230,7 @@ public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> impl
         HttpRespMsg msg=new HttpRespMsg();
         List<Product> productList=new ArrayList<>();
         List<ProdProcedure> prodProcedureList=new ArrayList<>();
+        List<Plan> needUpdatePlanList=new ArrayList<>();
 
 
         Integer companyId = userMapper.selectById(request.getHeader("token")).getCompanyId();
@@ -276,12 +276,13 @@ public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> impl
                 //产品基本信息
                 XSSFCell nameCell = row.getCell(0);
                 XSSFCell codeCell = row.getCell(1);
-                XSSFCell orderNumberCell = row.getCell(2);
-                XSSFCell unitCell = row.getCell(3);
-                XSSFCell groupNumberCell = row.getCell(4);
-                XSSFCell columnNumberCell = row.getCell(5);
-                XSSFCell vehicleNumberCell = row.getCell(6);
-                XSSFCell descriptionCell = row.getCell(7);
+                XSSFCell projectNameCell = row.getCell(2);
+                XSSFCell orderNumberCell = row.getCell(3);
+                XSSFCell unitCell = row.getCell(4);
+                XSSFCell groupNumberCell = row.getCell(5);
+                XSSFCell columnNumberCell = row.getCell(6);
+                XSSFCell vehicleNumberCell = row.getCell(7);
+                XSSFCell descriptionCell = row.getCell(8);
 
                 if(nameCell!=null){
                     nameCell.setCellType(CellType.STRING);
@@ -289,6 +290,9 @@ public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> impl
                 if(codeCell!=null){
                     codeCell.setCellType(CellType.STRING);
                 }
+                if(projectNameCell!=null){
+                    projectNameCell.setCellType(CellType.STRING);
+                }
                 if(orderNumberCell!=null){
                     orderNumberCell.setCellType(CellType.NUMERIC);
                 }
@@ -316,14 +320,20 @@ public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> impl
                     if(StringUtils.isEmpty(nameCell.getStringCellValue())){
                         continue;
                     }
+                    if(projectNameCell==null){
+                        msg.setError("项目名称不能为空");
+                        return msg;
+                    }
                     Product selectOne = productMapper.selectOne(new LambdaQueryWrapper<Product>()
                             .eq(companyId != null, Product::getCompanyId, companyId)
                             .eq(!StringUtils.isEmpty(nameCell.getStringCellValue()), Product::getName, nameCell.getStringCellValue())
+                            .eq(Product::getProjectName,projectNameCell.getStringCellValue())
                     );
                     if(selectOne!=null){
-                        product.setName(nameCell.getStringCellValue());
                         product.setId(selectOne.getId());
                     }
+                    product.setName(nameCell.getStringCellValue());
+                    product.setProjectName(projectNameCell.getStringCellValue());
 //                    else{
 //                        msg.setError("产品名和已存在的产品重复");
 //                        return msg;
@@ -458,7 +468,7 @@ public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> impl
                     msg.setError("质检类型不能为空");
                     return msg;
                 }
-
+                prodProcedure.setSeq(indexNum);
                 prodProcedureList.add(prodProcedure);
             }
 
@@ -480,13 +490,20 @@ public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> impl
                     return msg;
                 }
             }
-
             //插入数据
             if(saveOrUpdateBatch(productList)) {
                 List<Integer> productIds = productList.stream().map(Product::getId).distinct().collect(Collectors.toList());
                 List<ProdProcedure> prodProcedures = prodProcedureMapper.selectList(new LambdaQueryWrapper<ProdProcedure>().in(ProdProcedure::getProductId, productIds));
+                List<Plan> planList = planService.list(new LambdaQueryWrapper<Plan>().select(Plan::getId).in(Plan::getProductId, productIds));
                 for (Product product : productList) {
                     List<ProdProcedure> procedureList = prodProcedures.stream().filter(p -> p.getProductId().equals(product.getId())).collect(Collectors.toList());
+                    List<Plan> plans = planList.stream().filter(p -> p.getProductId().equals(product.getId())).collect(Collectors.toList());
+                    plans.forEach(p->{
+                        p.setProjectName(product.getProjectName());
+                        p.setProjectCode(product.getCode());
+                        p.setProductName(product.getName());
+                    });
+                    needUpdatePlanList.addAll(plans);
                     //找到当前产品下的工序版本号集合
                     List<String> versionNumberList = procedureList.stream().map(ProdProcedure::getVersionNumber).distinct().collect(Collectors.toList());
                     List<ProdProcedure> procedures = prodProcedureList.stream()
@@ -501,7 +518,7 @@ public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> impl
                 }
             }
             prodProcedureService.saveBatch(prodProcedureList);
-
+            planService.updateBatchById(needUpdatePlanList);
         } catch (IOException e) {
             e.printStackTrace();
         } catch (NullPointerException e) {
@@ -705,6 +722,7 @@ public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> impl
             List<String> titleProductList = new ArrayList<>();
             titleProductList.add("产品名称");
             titleProductList.add("项目代码");
+            titleProductList.add("项目名称");
             titleProductList.add("订单数量");
             titleProductList.add("单位");
             titleProductList.add("编组");
@@ -717,6 +735,7 @@ public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> impl
                 List<String> item=new ArrayList<>();
                 item.add(product.getName());
                 item.add(product.getCode());
+                item.add(product.getProjectName());
                 item.add(product.getOrderNumber().toString());
                 item.add(product.getUnit());
                 item.add(product.getGroupNumber());

+ 110 - 12
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java

@@ -133,6 +133,8 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
     private ProdProcedureMapper prodProcedureMapper;
     @Resource
     private LeaveSheetService leaveSheetService;
+    @Resource
+    private ProdProcedureTeamService prodProcedureTeamService;
 
     @Value(value = "${upload.path}")
     private String path;
@@ -4106,10 +4108,14 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
             List<Map<String, Object>> targetList = personWorkHoursWagesList.stream().filter(p -> String.valueOf(p.get("crateDate")).equals(date)).collect(Collectors.toList());
             BigDecimal cost = targetList.stream().map(m -> new BigDecimal(String.valueOf(m.get("cost")))).reduce(BigDecimal.ZERO, BigDecimal::add);
             BigDecimal workTime = targetList.stream().map(m -> new BigDecimal(String.valueOf(m.get("workTime")))).reduce(BigDecimal.ZERO, BigDecimal::add);
+            BigDecimal tempCost = targetList.stream().map(m -> new BigDecimal(String.valueOf(m.get("tempCost")))).reduce(BigDecimal.ZERO, BigDecimal::add);
+            BigDecimal tempWorkTime = targetList.stream().map(m -> new BigDecimal(String.valueOf(m.get("tempWorkTime")))).reduce(BigDecimal.ZERO, BigDecimal::add);
             map.put("userId","0");
             map.put("crateDate",date);
             map.put("cost",cost.doubleValue());
             map.put("workTime",workTime.doubleValue());
+            map.put("tempCost",tempCost.doubleValue());
+            map.put("tempWorkTime",tempWorkTime.doubleValue());
             totalList.add(map);
         }
 //        totalUser.setPersonWorkHoursWages(totalList);
@@ -4120,6 +4126,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
         List<LeaveSheet> leaveSheetList = leaveSheetService.list(new LambdaQueryWrapper<LeaveSheet>().le(LeaveSheet::getStartDate, endDate).ge(LeaveSheet::getEndDate, startDate));
         //日期范围内所有派工数据
         List<Integer> ids = allProcedureTeamList.stream().map(ProdProcedureTeam::getPlanProcedureId).distinct().collect(Collectors.toList());
+        ids.add(-1);
         List<PlanProcedureTotal> planProcedureTotalList = planProcedureTotalMapper.selectList(new LambdaQueryWrapper<PlanProcedureTotal>().in(PlanProcedureTotal::getId, ids));
         for (User u : userList) {
             List<Map<String, Object>> mapList = personWorkHoursWagesList.stream().filter(pl -> String.valueOf(pl.get("userId")).equals(u.getId())).collect(Collectors.toList());
@@ -4135,6 +4142,13 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                         double cost = targetTeams.stream().mapToDouble(i -> i.getJobOfMoney().doubleValue()).sum();
                         map.put("planCost", String.format("%.2f", cost));
                         map.put("planWorkTime", String.format("%.2f", workTime));
+                        Optional<LeaveSheet> first = leaveSheetList.stream().filter(l ->
+                                (l.getStartDate().isBefore(LocalDate.parse(date, dtf1)) || l.getStartDate().isEqual(LocalDate.parse(date, dtf1)))
+                                        &&
+                                        (l.getEndDate().isAfter(LocalDate.parse(date, dtf1)) || l.getEndDate().isEqual(LocalDate.parse(date, dtf1))) && l.getOwnerId().equals(u.getId())).findFirst();
+                        if(first.isPresent()){
+                            map.put("leave",LeaveSheet.leaveTypes[first.get().getLeaveType()]+"/"+first.get().getTimeHours()+"h");
+                        }
                         List<Integer> totalIds = targetTeams.stream().map(ProdProcedureTeam::getPlanProcedureId).distinct().collect(Collectors.toList());
                         //获取与本人分配相关的所有派工数据
                         List<PlanProcedureTotal> targetPlanTotals = planProcedureTotalList.stream().filter(p -> totalIds.contains(p.getId())).collect(Collectors.toList());
@@ -4173,16 +4187,18 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                 } else {
                     Map map = new HashMap();
                     //不存在报工数据显示请假详情数据
-                    boolean match = leaveSheetList.stream().anyMatch(l ->
+                    Optional<LeaveSheet> first = leaveSheetList.stream().filter(l ->
                             (l.getStartDate().isBefore(LocalDate.parse(date, dtf1)) || l.getStartDate().isEqual(LocalDate.parse(date, dtf1)))
                                     &&
-                                    (l.getEndDate().isAfter(LocalDate.parse(date, dtf1)) || l.getEndDate().isEqual(LocalDate.parse(date, dtf1))) && l.getOwnerId().equals(u.getId()));
-                    if(match){
-                        map.put("leave","当天请假");
+                                    (l.getEndDate().isAfter(LocalDate.parse(date, dtf1)) || l.getEndDate().isEqual(LocalDate.parse(date, dtf1))) && l.getOwnerId().equals(u.getId())).findFirst();
+                    if(first.isPresent()){
+                        map.put("leave",LeaveSheet.leaveTypes[first.get().getLeaveType()]+"/"+first.get().getTimeHours()+"h");
                     }
                     map.put("crateDate", date);
                     map.put("cost", 0);
                     map.put("workTime", 0);
+                    map.put("tempCost", 0);
+                    map.put("tempWorkTime", 0);
                     map.put("departmentName", u.getDepartmentName());
                     if (targetTeams.size() > 0) {
                         double workTime = targetTeams.stream().mapToDouble(ProdProcedureTeam::getWorkTime).sum();
@@ -4240,9 +4256,13 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
             double surplusWorkTime = mapList.stream().filter(mt -> mt.get("surplusTime") != null).mapToDouble(mt -> Double.valueOf(String.valueOf(mt.get("surplusTime")))).sum();
             BigDecimal surplusBigDecimal = new BigDecimal(surplusWorkTime);
             double surplusCost = mapList.stream().filter(mt -> mt.get("surplusCost") != null).mapToDouble(mt -> Double.valueOf(String.valueOf(mt.get("surplusCost")))).sum();
+            double tempWorkTime = mapList.stream().filter(mt -> mt.get("tempWorkTime") != null).mapToDouble(mt -> Double.valueOf(String.valueOf(mt.get("tempWorkTime")))).sum();
+            BigDecimal tempBigDecimal = new BigDecimal(tempWorkTime);
+            double tempCost = mapList.stream().filter(mt -> mt.get("tempCost") != null).mapToDouble(mt -> Double.valueOf(String.valueOf(mt.get("tempCost")))).sum();
             u.setTotalResult(String.valueOf(bigDecimal.doubleValue()) + "分钟 " + String.format("%.2f", cost) + "元");
             u.setTotalPlanResult(String.valueOf(planBigDecimal.doubleValue()) + "分钟 " + String.format("%.2f", planCost) + "元");
             u.setTotalSurplusResult(String.valueOf(surplusBigDecimal.doubleValue()) + "分钟 " + String.format("%.2f", surplusCost) + "元");
+            u.setTotalTempResult(String.valueOf(tempBigDecimal.doubleValue()) + "分钟 " + String.format("%.2f", tempCost) + "元");
         }
         resultMap.put("total",userIPage.getTotal());
         resultMap.put("records",userList);
@@ -4287,11 +4307,6 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
     @Override
     public HttpRespMsg getPersonWorkHoursWagesDetail(String date, String userId,String startDate,String endDate) {
         User user = userMapper.selectById(request.getHeader("token"));
-//        if(checkStatus!=null&&checkStatus==0&&StringUtils.isEmpty(userId)){
-//            userId=user.getId();
-//        }
-        boolean canViewAll = sysFunctionService.hasPriviledge(user.getRoleId(), "查看全部人员工时工价");
-        List<Department> allDeptList = departmentMapper.selectList(new LambdaQueryWrapper<Department>().eq(Department::getCompanyId, user.getCompanyId()));
         List<Department> departmentList = departmentMapper.selectList(new QueryWrapper<Department>().eq("company_id", user.getCompanyId()).eq("manager_id", user.getId()));
         List<DepartmentOtherManager> departmentOtherManagers = departmentOtherManagerMapper.selectList(new QueryWrapper<DepartmentOtherManager>().eq("company_id", user.getCompanyId()).eq("other_manager_id", user.getId()));
         List<Integer> deptIds = departmentList.stream().map(Department::getDepartmentId).distinct().collect(Collectors.toList());
@@ -4327,7 +4342,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
         HttpRespMsg httpRespMsg=new HttpRespMsg();
         HashMap map=new HashMap();
         if(checkStatus!=null && detailStatus==null){
-            List<Map<String,Object>> mapList=reportMapper.getPersonWorkHoursWagesDetailForMob(date,user.getId(),user.getCompanyId(),startDate,endDate,checkStatus,detailStatus);
+            List<Map<String,Object>> mapList=reportMapper.getPersonWorkHoursWagesDetailForMob(date,userId,user.getCompanyId(),startDate,endDate,checkStatus,detailStatus);
             DateTimeFormatter dtf=DateTimeFormatter.ofPattern("yyyy-MM-dd");
             DateTimeFormatter dtf1=DateTimeFormatter.ofPattern("yyyyMMdd");
             List<LocalDate> allDateList = getDays(LocalDate.parse(startDate, dtf), LocalDate.parse(endDate, dtf));
@@ -4406,6 +4421,19 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
         return httpRespMsg;
     }
 
+    @Override
+    public HttpRespMsg getPersonWorkHoursWagesDetailForTemp(String date, String userId, String startDate, String endDate) {
+        User user = userMapper.selectById(request.getHeader("token"));
+        List<Map<String,Object>> mapList=reportMapper.getPersonWorkHoursWagesDetailForTemp(date,userId,user.getCompanyId(),startDate,endDate);
+        HttpRespMsg httpRespMsg=new HttpRespMsg();
+        HashMap map=new HashMap();
+        map.put("record",mapList);
+        map.put("totalWorkingTime",mapList.stream().filter(i->i.get("working_time")!=null).mapToDouble(mt->Double.valueOf(String.valueOf(mt.get("working_time")))).sum());
+        map.put("totalCost",mapList.stream().filter(i->i.get("cost")!=null).mapToDouble(mt->Double.valueOf(String.valueOf(mt.get("cost")))).sum());
+        httpRespMsg.setData(map);
+        return httpRespMsg;
+    }
+
     private List<Integer> getBranchDepartment(Integer departmentId, List<Department> departmentList) {
         List<Integer> list = new ArrayList<>();
         list.add(departmentId);
@@ -4932,7 +4960,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
             }
             item.add(map.get("productOrderNum")==null?"":String.valueOf(map.get("productOrderNum")));
             item.add(String.valueOf(map.get("procedureName")));
-            item.add("");
+            item.add(map.get("steelNumArray")==null?"":String.valueOf(map.get("steelNumArray")));
             item.add("");
             item.add("");
 //            item.add(String.valueOf(map.get("progress"))+"%");
@@ -5001,7 +5029,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
             }
             planProcedureTotal.setTotalFillTime(workingTime);
             BigDecimal bigDecimal = new BigDecimal(workingTime);
-            bigDecimal=bigDecimal.divide(new BigDecimal(planProcedureTotal.getTotalWorkingHours()));
+            bigDecimal=bigDecimal.divide(new BigDecimal(planProcedureTotal.getTotalWorkingHours()), 4,RoundingMode.HALF_UP);
             bigDecimal=bigDecimal.multiply(new BigDecimal(100)).setScale(0,RoundingMode.HALF_UP);
             planProcedureTotal.setTotalProgress(bigDecimal.intValue());
 //            planProcedureTotal.setTotalProgress((int)((workingTime / planProcedureTotal.getTotalWorkingHours()) * 100));
@@ -6150,4 +6178,74 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
         msg.setData("修复完成, 共修复"+updateList.size()+"条数据");
         return msg;
     }
+
+    @Override
+    @Transactional
+    public HttpRespMsg updateHasDeleteTeamData() {
+        HttpRespMsg msg=new HttpRespMsg();
+        List<Report> reportList = reportService.list(new LambdaQueryWrapper<Report>().inSql(Report::getId, "SELECT r.id FROM report r\n" +
+                "LEFT JOIN prod_procedure_team ppt ON r.user_procedure_team_id=ppt.id\n" +
+                "WHERE ppt.id IS NULL AND r.user_procedure_team_id IS NOT NULL"));
+        List<ProdProcedureTeam> list=new ArrayList<>();
+        for (Report report : reportList) {
+            PlanProcedureTotal planProcedureTotal = planProcedureTotalMapper.selectOne(new LambdaQueryWrapper<PlanProcedureTotal>().eq(PlanProcedureTotal::getPlanId, report.getPlanId()).eq(PlanProcedureTotal::getProdProcedureId, report.getProdProcedureId()));
+            if(planProcedureTotal!=null){
+                //未删除的数据
+                List<ProdProcedureTeam> procedureTeams = prodProcedureTeamMapper.selectList(new LambdaQueryWrapper<ProdProcedureTeam>().eq(ProdProcedureTeam::getPlanProcedureId, planProcedureTotal.getId()));
+                List<String> ptlist = procedureTeams.stream().map(u -> u.getUserId()).collect(Collectors.toList());
+                ptlist.add(report.getCreatorId());
+                List<Report> reports = reportList.stream().filter(f -> f.getProdProcedureId().equals(planProcedureTotal.getProdProcedureId()) && f.getPlanId().equals(planProcedureTotal.getPlanId())).collect(Collectors.toList());
+                List<String> integers = reports.stream().map(Report::getCreatorId).distinct().collect(Collectors.toList());
+                ptlist.addAll(integers);
+                String teamIds=integers.stream().distinct().collect(Collectors.joining(","));
+                String[] team = teamIds.split(",");
+                Integer companyId = userMapper.selectById(request.getHeader("token")).getCompanyId();
+                BigDecimal totalWages=new BigDecimal((planProcedureTotal.getTotalWages()==null||StringUtils.isEmpty(planProcedureTotal.getTotalWages()))?0:planProcedureTotal.getTotalWages());
+                BigDecimal totalWorkingHours=new BigDecimal((planProcedureTotal.getTotalWorkingHours()==null||StringUtils.isEmpty(planProcedureTotal.getTotalWorkingHours())?0:planProcedureTotal.getTotalWorkingHours()));
+                BigDecimal overCountWages = new BigDecimal(0);
+                BigDecimal overWorkingHours = new BigDecimal(0);
+                Plan plan = planMapper.selectById(planProcedureTotal.getPlanId());
+                totalWages=totalWages.divide(new BigDecimal(team.length),1, RoundingMode.HALF_UP);
+                totalWorkingHours=totalWorkingHours.divide(new BigDecimal(team.length),1, RoundingMode.HALF_UP);
+                overCountWages=totalWages.multiply(new BigDecimal(team.length));
+                overWorkingHours=totalWorkingHours.multiply(new BigDecimal(team.length));
+                List<ProdProcedureTeam> procedureTeamList = prodProcedureTeamService.list(new QueryWrapper<ProdProcedureTeam>().eq("plan_procedure_id",planProcedureTotal.getId()));
+                List<User> userList = userMapper.selectBatchIds(Arrays.asList(team));
+                for (int i = 0; i < team.length; i++) {
+                    ProdProcedureTeam prodProcedureTeam=new ProdProcedureTeam();
+                    int finalI1 = i;
+                    Optional<ProdProcedureTeam> first1 = procedureTeams.stream().filter(p -> p.getUserId().equals(team[finalI1])).findFirst();
+                    if(first1.isPresent()){
+                        prodProcedureTeam.setId(first1.get().getId());
+                        prodProcedureTeam.setDistributeDate(first1.get().getDistributeDate());
+                    }else {
+                        prodProcedureTeam.setDistributeDate(report.getCreateDate());
+                    }
+                    prodProcedureTeam.setCompanyId(companyId);
+                    prodProcedureTeam.setPlanProcedureId(planProcedureTotal.getId());
+                    prodProcedureTeam.setUserId(team[i]);
+                    prodProcedureTeam.setStatus(2);
+                    int finalI = i;
+                    //已存在的人员更新处理
+                    Optional<ProdProcedureTeam> first = procedureTeamList.stream().filter(pl -> pl.getUserId().equals(team[finalI])).findFirst();
+                    if(first.isPresent()){
+                        prodProcedureTeam.setId(first.get().getId());
+                    }
+                    if(i==team.length-1){
+                        double wagesAbs =new BigDecimal(planProcedureTotal.getTotalWages()).subtract(overCountWages).doubleValue();
+                        double workTimesAbs =new BigDecimal(planProcedureTotal.getTotalWorkingHours()).subtract(overWorkingHours).doubleValue();
+                        prodProcedureTeam.setWorkTime(totalWorkingHours.add(new BigDecimal(workTimesAbs)).doubleValue());
+                        prodProcedureTeam.setJobOfMoney(totalWages.add(new BigDecimal(wagesAbs)));
+                    }else {
+                        prodProcedureTeam.setWorkTime(totalWorkingHours.doubleValue());
+                        prodProcedureTeam.setJobOfMoney(totalWages);
+                    }
+                    prodProcedureTeamService.saveOrUpdate(prodProcedureTeam);
+                    report.setUserProcedureTeamId(prodProcedureTeam.getId());
+                }
+            }
+        }
+        reportService.updateBatchById(reportList);
+        return msg;
+    }
 }

+ 45 - 5
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/service/impl/WxCorpInfoServiceImpl.java

@@ -8,6 +8,7 @@ import com.management.platform.controller.WeiXinCorpController;
 import com.management.platform.entity.*;
 import com.management.platform.mapper.*;
 import com.management.platform.service.WxCorpInfoService;
+import com.management.platform.service.WxCorpTemplateService;
 import com.management.platform.util.*;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
@@ -82,6 +83,9 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
     //获取审批申请详情
     public static final String GET_APPROVAL_DETAIL = "https://qyapi.weixin.qq.com/cgi-bin/oa/getapprovaldetail?access_token=ACCESS_TOKEN";
 
+    //获取企业审批模板详情
+    public static final String GET_TEMPLATE_DETAIL = "https://qyapi.weixin.qq.com/cgi-bin/oa/gettemplatedetail?access_token=ACCESS_TOKEN";
+
 
     public static final int TEXT_CARD_MSG_BUSTRIP_WAITING_AUDIT = 0;//出差待审核
     public static final int TEXT_CARD_MSG_BUSTRIP_AGREE = 1;//出差审核通过
@@ -127,6 +131,8 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
     UserMapper userMapper;
     @Resource
     UserCorpwxTimeMapper userCorpwxTimeMapper;
+    @Resource
+    WxCorpTemplateService wxCorpTemplateService;
 
     @Resource
     TimeTypeMapper timeTypeMapper;
@@ -1996,12 +2002,15 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
         long unixTimestamp = instant.getEpochSecond();
         return unixTimestamp;
     }
-
     /**
-     * 批量获取审批单号
-     * PS:Integer recordType 1-请假;2-打卡补卡;3-出差;4-外出;5-加班; 6- 调班;7-会议室预定;8-退款审批;9-红包报销审批
-     *    Integer sp_status 1-审批中;2-已通过;3-已驳回;4-已撤销;6-通过后撤销;7-已删除;10-已支付
-     * */
+     * @Description:企业内部应用获取指定时间范围内的审批单号
+     * @Param: [companyId, spNo]
+     * @return: java.lang.String
+     * @Author: yurk
+     * @PS: Integer recordType 1-请假;2-打卡补卡;3-出差;4-外出;5-加班; 6- 调班;7-会议室预定;8-退款审批;9-红包报销审批
+     *     Integer sp_status 1-审批中;2-已通过;3-已驳回;4-已撤销;6-通过后撤销;7-已删除;10-已支付
+     * @Date: 2024/6/19
+     */
     @Override
     public List<String> getApprovalInfo(Integer companyId, String startDate, String endDate, String newCursor, JSONArray filterArray) throws Exception {
         DateTimeFormatter df=DateTimeFormatter.ofPattern("yyyy-MM-dd");
@@ -2044,7 +2053,38 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
         return null;
     }
 
+    /**
+     * 企业内部应用获取企业审批模板详情
+     * */
+    @Override
+    public String getTemplateDetail(Integer companyId) throws Exception {
+        WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id",companyId));
+        WxCorpTemplate template = wxCorpTemplateService.getById(wxCorpInfo.getCompanyId());
+        String url=GET_TEMPLATE_DETAIL.replace("ACCESS_TOKEN",getCorpAgentAccessToken(wxCorpInfo));
+        HttpHeaders headers = new HttpHeaders();
+        RestTemplate restTemplate = new RestTemplate();
+        MediaType type = MediaType.parseMediaType("application/json; charset=UTF-8");
+        headers.setContentType(type);
+        headers.add("Accept", MediaType.APPLICATION_JSON.toString());
+        JSONObject requestMap = new JSONObject();
+        requestMap.put("template_id",template.getTemplateId());
+        HttpEntity<JSONObject> entity = new HttpEntity<>(requestMap, headers);
+        ResponseEntity<String> ResponseEntity = restTemplate.postForEntity(url, entity, String.class);
+        if (ResponseEntity.getStatusCode() == HttpStatus.OK) {
+            String resp = ResponseEntity.getBody();
+            return resp;
+        }
+        return null;
+    }
+
 
+    /**
+    * @Description:企业内部应用获取审批单详情
+    * @Param: [companyId, spNo]
+    * @return: java.lang.String
+    * @Author: yurk
+    * @Date: 2024/6/19
+    */
     @Override
     public String getApprovalInfoDetail(Integer companyId,String spNo) throws Exception {
         WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id",companyId));

+ 20 - 0
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/service/impl/WxCorpTemplateServiceImpl.java

@@ -0,0 +1,20 @@
+package com.management.platform.service.impl;
+
+import com.management.platform.entity.WxCorpTemplate;
+import com.management.platform.mapper.WxCorpTemplateMapper;
+import com.management.platform.service.WxCorpTemplateService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author Seyason
+ * @since 2024-06-19
+ */
+@Service
+public class WxCorpTemplateServiceImpl extends ServiceImpl<WxCorpTemplateMapper, WxCorpTemplate> implements WxCorpTemplateService {
+
+}

+ 218 - 0
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/task/TimingTask.java

@@ -27,6 +27,7 @@ import org.springframework.http.client.ClientHttpResponse;
 import org.springframework.scheduling.annotation.EnableScheduling;
 import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Component;
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.StringUtils;
 import org.springframework.web.client.DefaultResponseErrorHandler;
 import org.springframework.web.client.RestTemplate;
@@ -91,12 +92,22 @@ public class TimingTask {
     private WxCorpInfoService wxCorpInfoService;
     @Resource
     private WxCorpInfoMapper wxCorpInfoMapper;
+    @Resource
+    private WxCorpTemplateService wxCorpTemplateService;
     @Value(value = "${upload.path}")
     private String path;
     @Resource
     private TimeTypeService timeTypeService;
     @Resource
     private LeaveSheetService leaveSheetService;
+    @Resource
+    private DepartmentService departmentService;
+    @Resource
+    private TaskTypeService taskTypeService;
+    @Resource
+    private PlanService planService;
+    @Resource
+    private ReportService reportService;
 
     private static final List<Integer> VALID_TOKEN_CHARS = new ArrayList<>();
     static {
@@ -327,5 +338,212 @@ public class TimingTask {
             }
         }
     }
+        /**
+        * @Description:同步临时报工申请数据到车间管家
+        * @Param:
+        * @return:
+        * @Author: yurk
+        * @Date: 2024/6/20
+        */
+    @Scheduled(cron = "0 20 2 ? * *")
+    public void getTemporaryJobApplication() throws Exception {
+        if(isDev){
+            return;
+        }
+        DateTimeFormatter df=DateTimeFormatter.ofPattern("yyyy-MM-dd");
+        LocalDate start=LocalDate.now().minusDays(1);
+        LocalDate end=LocalDate.now();
+        JSONArray jsonArrayFilter = new JSONArray();
+        JSONObject filter1 = new JSONObject();
+        WxCorpTemplate template = wxCorpTemplateService.getById(7);
+        filter1.put("key","template_id");
+        filter1.put("value",template.getTemplateId());
+        jsonArrayFilter.add(filter1);
+        JSONObject filter2 = new JSONObject();
+        filter2.put("key","sp_status");
+        filter2.put("value",2);
+        jsonArrayFilter.add(filter2);
+        List<String> approvalInfo = wxCorpInfoService.getApprovalInfo(7, df.format(start), df.format(end), "", jsonArrayFilter);
+        List<Department> departmentList = departmentService.list(new LambdaQueryWrapper<Department>().eq(Department::getCompanyId, 7));
+        List<TaskType> taskTypeList = taskTypeService.list(new LambdaQueryWrapper<TaskType>().eq(TaskType::getCompanyId, 7));
+        List<User> userList = userMapper.selectList(new LambdaQueryWrapper<User>().eq(User::getCompanyId,7));
+        if(approvalInfo!=null){
+            for (int i = 0; i < approvalInfo.size(); i++) {
+                String codeNum = approvalInfo.get(i);
+                String approvalInfoDetailResp = wxCorpInfoService.getApprovalInfoDetail(7, codeNum);
+                JSONObject approvalInfoDetail = JSONObject.parseObject(approvalInfoDetailResp);
+                JSONObject info = approvalInfoDetail.getJSONObject("info");
+                JSONObject applyer = info.getJSONObject("applyer");
+                String userid = applyer.getString("userid");
+                Optional<User> first = userList.stream().filter(u ->u.getCorpwxRealUserid()!=null&&u.getCorpwxRealUserid().equals(userid)).findFirst();
+                if(!first.isPresent()){
+                    continue;
+                }
+                JSONObject apply_data = info.getJSONObject("apply_data");
+                System.out.println("获取到的单据信息===========>"+apply_data);
+                JSONArray contents = apply_data.getJSONArray("contents");
+                //生成 车间插单计划
+                Plan plan=new Plan();
+                plan.setCompanyId(7);
+                plan.setCreateTime(LocalDateTime.now());
+                plan.setPlanType(1);
+                plan.setCreateId(first.get().getId());
+                //参与人员列表
+                List<String> userTeams=new ArrayList<>();
+                //初始化 单价(元/小时)
+                BigDecimal price=new BigDecimal(0);
+                //初始化 工作时长
+                double workTime=0;
+                //初始话 工作日期
+                JSONArray sp_record = info.getJSONArray("sp_record");
+                //获取最后一个审批节点
+                JSONObject last_sp_record = sp_record.getJSONObject(sp_record.size() - 1);
+                JSONArray details = last_sp_record.getJSONArray("details");
+                //获取最后详情
+                JSONObject lastDetail = details.getJSONObject(details.size() - 1);
+                long sptime = lastDetail.getLongValue("sptime");
+                LocalDate createDate=LocalDate.now();
+                //初始化工位
+                Integer deptId=0;
+                for (int i1 = 0; i1 < contents.size(); i1++) {
+                    JSONObject map = contents.getJSONObject(i1);
+                    JSONArray title = map.getJSONArray("title");
+                    JSONObject value = map.getJSONObject("value");
+                    String control = map.getString("control");
+                    if(title.getJSONObject(0).getString("text").equals("临时报工分类")){
+                        if(control.equals("Selector")){
+                            JSONObject selector = value.getJSONObject("selector");
+                            JSONArray options = selector.getJSONArray("options");
+                            JSONObject object = options.getJSONObject(0);
+                            JSONArray value1 = object.getJSONArray("value");
+                            JSONObject jsonObject = value1.getJSONObject(0);
+                            String text = jsonObject.getString("text");
+                            Optional<TaskType> first1 = taskTypeList.stream().filter(t -> t.getTaskTypeName().equals(text)).findFirst();
+                            if(first1.isPresent()){
+                                plan.setTaskTypeId(first1.get().getId());
+                                plan.setTaskTypeName(first1.get().getTaskTypeName());
+                            }
+                        }
+                    }
+                    if(title.getJSONObject(0).getString("text").equals("事由")){
+                        if(control.equals("Text")||control.equals("Textarea")){
+                            String text = value.getString("text");
+                            plan.setTaskName(text);
+                        }
+                    }
+                    //先处理多个人员 公用此单据非工时部分内容
+                    if(title.getJSONObject(0).getString("text").equals("参与人员")){
+                        if(control.equals("Contact")){
+                            JSONArray members = value.getJSONArray("members");
+                            for (int i2 = 0; i2 < members.size(); i2++) {
+                                JSONObject jsonObject = members.getJSONObject(i2);
+                                String userid1 = jsonObject.getString("userid");
+                                userTeams.add(userid1);
+                            }
+
+                        }
+                    }
+                    if(title.getJSONObject(0).getString("text").equals("参与人数")){
+                        if(control.equals("Number")){
+                            int new_number = value.getIntValue("new_number");
+                            plan.setPlanManNum(new_number);
+                        }
+                    }
+                    if(title.getJSONObject(0).getString("text").equals("开始时间")){
+                        if(control.equals("Date")){
+                            JSONObject date = value.getJSONObject("date");
+                            long s_timestamp = date.getLongValue("s_timestamp");
+                            LocalDate localDateFromUnix = DateTimeUtil.getLocalDateFromUnix(s_timestamp);
+                            plan.setStartDate(localDateFromUnix);
+                            if(sptime>0){
+                                createDate= DateTimeUtil.getLocalDateFromUnix(sptime);
+                            }else {
+                                createDate=localDateFromUnix;
+                            }
+
+                        }
+                    }
+                    if(title.getJSONObject(0).getString("text").equals("结束时间")){
+                        if(control.equals("Date")){
+                            JSONObject date = value.getJSONObject("date");
+                            long s_timestamp = date.getLongValue("s_timestamp");
+                            LocalDate localDateFromUnix = DateTimeUtil.getLocalDateFromUnix(s_timestamp);
+                            plan.setEndDate(localDateFromUnix);
+                            if(sptime>0){
+                                createDate= DateTimeUtil.getLocalDateFromUnix(sptime);
+                            }else {
+                                createDate=localDateFromUnix;
+                            }
+                        }
+                    }
+                    if(title.getJSONObject(0).getString("text").equals("工作时长")){
+                        if(control.equals("Number")){
+                            double new_number = value.getDoubleValue("new_number");
+                            workTime=new_number;
+                        }
+                    }
+                    BigDecimal bigDecimal = new BigDecimal(plan.getPlanManNum()==null?0:plan.getPlanManNum());
+                    //工时以分钟为单位 *60
+                    bigDecimal=bigDecimal.multiply(new BigDecimal(workTime));
+                    bigDecimal=bigDecimal.multiply(new BigDecimal(60));
+                    plan.setPlanWorkHour(bigDecimal.doubleValue());
+                    if(title.getJSONObject(0).getString("text").equals("所属工位")){
+                        if(control.equals("Contact")){
+                            JSONArray departments = value.getJSONArray("departments");
+                            String openapi_id = departments.getJSONObject(0).getString("openapi_id");
+                            Optional<Department> first1 = departmentList.stream().filter(d -> d.getCorpwxDeptid().equals(Integer.valueOf(openapi_id))).findFirst();
+                            if(first1.isPresent()){
+                                plan.setStationId(first1.get().getDepartmentId());
+                                plan.setStationName(first1.get().getDepartmentName());
+                                plan.setForemanId(first1.get().getManagerId());
+                                Optional<User> first2 = userList.stream().filter(u -> u.getId().equals(first1.get().getManagerId())).findFirst();
+                                if(first2.isPresent()){
+                                    plan.setForemanName(first2.get().getName());
+                                }
+                                deptId=first1.get().getDepartmentId();
+                            }
+                        }
+                    }
+                    if(title.getJSONObject(0).getString("text").contains("单价")){
+                        if(control.equals("Number")){
+                            Double new_money = value.getDouble("new_number");
+                            plan.setMoneyOfJob(new BigDecimal(new_money));
+                            price=new BigDecimal(new_money);
+                        }
+                    }
+                    if(title.getJSONObject(0).getString("text").equals("备注")){
+                        if(control.equals("Text")||control.equals("Textarea")){
+                            String text = value.getString("text");
+                            plan.setDescribtion(text);
+                        }
+                    }
+                }
+                planService.save(plan);
+                List<Report> reportList=new ArrayList<>();
+                //处理人员日报数据
+                for (String userTeam : userTeams) {
+                    Optional<User> user = userList.stream().filter(u -> u.getCorpwxRealUserid() != null && u.getCorpwxRealUserid().equals(userTeam)).findFirst();
+                    if(user.isPresent()){
+                        Report report=new Report();
+                        report.setCreateDate(createDate);
+                        report.setCreatorId(user.get().getId());
+                        report.setCreateTime(LocalDateTime.now());
+                        BigDecimal bigDecimal = new BigDecimal(workTime);
+                        bigDecimal=bigDecimal.multiply(price);
+                        report.setCost(bigDecimal);
+                        report.setWorkingTime(workTime);
+                        report.setStatus(2);
+                        report.setPlanId(plan.getId());
+                        report.setCompanyId(7);
+                        report.setDeptId(deptId);
+                        reportList.add(report);
+                    }
+                }
+                if(reportList.size()>0){
+                    reportService.saveBatch(reportList);
+                }
+            }
+        }
+    }
 
 }

+ 44 - 0
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/util/CodeUtil.java

@@ -0,0 +1,44 @@
+package com.management.platform.util;
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.text.DecimalFormat;
+import java.util.Random;
+
+/**
+ * Author: 吴涛涛 cuiyi@itany.com
+ * Date : 2019 - 10 - 24 16:23
+ * Description:验证码生成工具
+ * Version: 1.0
+ */
+public class CodeUtil {
+
+
+    public HttpRespMsg getVcode(String mobile) {
+        HttpRespMsg msg = new HttpRespMsg();
+        if (mobile != null) {
+            Random r = new Random();
+            int val = r.nextInt(10000);
+            if (val < 1000) {
+                val += 1000;
+            }
+            String codeValStr = "" + val;
+//            Vcode record = new Vcode();
+//            record.setMobile(mobile);
+//            record.setVcode("" + val);
+//            vcodeMapper.insertSelective(record);
+//            try {
+//                SendSmsResponse sendSmsResponse = SmsDemo.sendSms(mobile, record.getVcode());
+//            } catch (ClientException e) {
+//                e.printStackTrace();
+//            }
+        }
+        return msg;
+    }
+
+    public static void main(String[] args) {
+        double temp = 1.42;
+        int thirdPosNum = ((int)(temp*1000))%10;
+        System.out.println(thirdPosNum);
+    }
+}

+ 153 - 0
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/util/FileUtil.java

@@ -0,0 +1,153 @@
+package com.management.platform.util;
+
+import com.fasterxml.jackson.annotation.ObjectIdGenerators;
+import org.apache.commons.io.FileUtils;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.*;
+import java.util.Arrays;
+
+/**
+ * 文件读取工具类
+ */
+public class FileUtil {
+
+    /**
+     * 获取容易识别的文件大小,比如KB, MB, GB
+     * @param size
+     * @return
+     */
+    public static String getReadableFileSize(long size) {
+        if (size < 1024) {//1K以内
+            return size + "byte";
+        } else if (size < 1024 * 1024) {//1M以内
+            return String.format("%.1fKB", (size*1.0f/1024));
+        } else if (size < 1024 * 1024 * 1024) {//1G以内
+            return String.format("%.1fMB", (size*1.0f/1024/1024));
+        } else {
+            return String.format("%.1fGB", (size*1.0f/1024/1024/1024));
+        }
+    }
+
+
+    /**
+     * 读取文件内容,作为字符串返回
+     */
+    public static String readFileAsString(String filePath) throws IOException {
+        File file = new File(filePath);
+        if (!file.exists()) {
+            throw new FileNotFoundException(filePath);
+        }
+
+        if (file.length() > 1024 * 1024 * 1024) {
+            throw new IOException("File is too large");
+        }
+
+        StringBuilder sb = new StringBuilder((int) (file.length()));
+        // 创建字节输入流  
+        FileInputStream fis = new FileInputStream(filePath);
+        // 创建一个长度为10240的Buffer
+        byte[] bbuf = new byte[10240];
+        // 用于保存实际读取的字节数  
+        int hasRead = 0;
+        while ((hasRead = fis.read(bbuf)) > 0) {
+            sb.append(new String(bbuf, 0, hasRead));
+        }
+        fis.close();
+        return sb.toString();
+    }
+
+    /**
+     * 根据文件路径读取byte[] 数组
+     */
+    public static byte[] readFileByBytes(String filePath) throws IOException {
+        File file = new File(filePath);
+        if (!file.exists()) {
+            throw new FileNotFoundException(filePath);
+        } else {
+            ByteArrayOutputStream bos = new ByteArrayOutputStream((int) file.length());
+            BufferedInputStream in = null;
+
+            try {
+                in = new BufferedInputStream(new FileInputStream(file));
+                short bufSize = 1024;
+                byte[] buffer = new byte[bufSize];
+                int len1;
+                while (-1 != (len1 = in.read(buffer, 0, bufSize))) {
+                    bos.write(buffer, 0, len1);
+                }
+
+                byte[] var7 = bos.toByteArray();
+                return var7;
+            } finally {
+                try {
+                    if (in != null) {
+                        in.close();
+                    }
+                } catch (IOException var14) {
+                    var14.printStackTrace();
+                }
+
+                bos.close();
+            }
+        }
+    }
+
+    /**
+     * 根据文件路径读取byte[] 数组
+     */
+    public static byte[] readFileByBytes(File file) throws IOException {
+        if (file == null) {
+            throw new FileNotFoundException("file is not null");
+        } else {
+            ByteArrayOutputStream bos = new ByteArrayOutputStream((int) file.length());
+            BufferedInputStream in = null;
+            try {
+                in = new BufferedInputStream(new FileInputStream(file));
+                short bufSize = 1024;
+                byte[] buffer = new byte[bufSize];
+                int len1;
+                while (-1 != (len1 = in.read(buffer, 0, bufSize))) {
+                    bos.write(buffer, 0, len1);
+                }
+
+                byte[] var7 = bos.toByteArray();
+                return var7;
+            } finally {
+                try {
+                    if (in != null) {
+                        in.close();
+                    }
+                } catch (IOException var14) {
+                    var14.printStackTrace();
+                }
+
+                bos.close();
+            }
+        }
+    }
+
+
+    /**
+     * 删除
+     *
+     * @param files
+     */
+    private void deleteFile(File... files) {
+        for (File file : files) {
+            if (file.exists()) {
+                file.delete();
+            }
+        }
+    }
+
+    public static void main(String[] args) {
+        String file = "C:\\gitproject\\manHourHousekeeper\\fhKeeper\\formulahousekeeper\\timesheet-workshop-h5\\dist";
+        String target = "D:\\www\\staticproject\\workshop_h5";
+        try {
+            FileUtils.copyDirectory(new File(file), new File(target));
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+    }
+}

+ 150 - 0
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/util/ZipUtils.java

@@ -0,0 +1,150 @@
+package com.management.platform.util;
+
+import com.alibaba.excel.util.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.*;
+import java.util.Enumeration;
+import java.util.zip.*;
+
+/**
+ * @Description 压缩与解压工具
+ * @Author      yanghanwei
+ * @Date        18:42 2019-11-20
+ * @Version     v1
+ **/
+public class ZipUtils {
+
+    private static final Logger logger = LoggerFactory.getLogger(ZipUtils.class);
+
+    /**
+     * 压缩 zip
+     * @param filePath  文件夹 全路径
+     * @param fileName  文件夹名称
+     * @param outPath   压缩文件保存路径
+     */
+    public static void zipFile(String filePath, String fileName, String outPath) {
+        logger.info("filePath:{}, fileName:{}, outPath:{}", filePath, fileName, outPath);
+        try {
+            //创建Test.zip文件
+            OutputStream is = new FileOutputStream(outPath);
+            //检查输出流,采用CRC32算法,保证文件的一致性
+            CheckedOutputStream cos = new CheckedOutputStream(is, new CRC32());
+            //创建zip文件的输出流
+            ZipOutputStream zos = new ZipOutputStream(cos);
+            //需要压缩的文件或文件夹对象
+            File file = new File(filePath);
+            //压缩文件的具体实现函数
+            zipFilePost(zos,file,filePath,fileName,outPath);
+            zos.close();
+            cos.close();
+            is.close();
+            System.out.println("压缩完成");
+        } catch (Exception e) {
+            logger.error("压缩失败zipFile,Exception:" + e);
+        }
+    }
+
+    /**
+     * 压缩文件
+     * @param zos       zip文件的输出流
+     * @param file      需要压缩的文件或文件夹对象
+     * @param filePath  压缩的文件路径
+     * @param fileName  需要压缩的文件夹名
+     * @param outPath   缩完成后保存为Test.zip文件
+     */
+    private static void zipFilePost(ZipOutputStream zos, File file, String filePath, String fileName, String outPath){
+
+        try{
+            String path = file.getPath();
+            String zosName = "";
+            if(!StringUtils.isEmpty(path)){
+                zosName = path.substring(path.indexOf(fileName));
+            }
+            File[] files = file.listFiles();
+            if(file.isDirectory() && files != null && files.length > 0) {
+                // 创建压缩文件的目录结构
+                zos.putNextEntry(new ZipEntry(zosName + File.separator));
+                for(File f : files) {
+                    zipFilePost(zos, f, filePath, fileName, outPath);
+                }
+            } else {
+                logger.info("正在压缩文件:{}",file.getName());
+                // 创建压缩文件
+                zos.putNextEntry(new ZipEntry(zosName));
+                // 用字节方式读取源文件
+                InputStream is = new FileInputStream(file.getPath());
+                // 创建一个缓存区
+                BufferedInputStream bis = new BufferedInputStream(is);
+                // 字节数组,每次读取1024个字节
+                byte [] b = new byte[1024];
+                // 循环读取,边读边写
+                while(bis.read(b)!=-1) {
+                    // 写入压缩文件
+                    zos.write(b);
+                }
+                //关闭流
+                bis.close();
+                is.close();
+            }
+        } catch (Exception e) {
+            logger.error("压缩文件失败zipFilePost,Exception:" + e);
+        }
+    }
+
+    public static void unzip(String sourcePath, String targetPath) {
+        //targetPath输出文件路径
+        File targetFile = new File(targetPath);
+        // 如果目录不存在,则创建
+        if (!targetFile.exists()) {
+            targetFile.mkdirs();
+        }
+        //sourcePath压缩包文件路径
+        try (ZipFile zipFile = new ZipFile(new File(sourcePath))) {
+            System.out.println("file nums:" + zipFile.size());
+            Enumeration enumeration = zipFile.entries();
+            while (enumeration.hasMoreElements()) {
+                //依次获取压缩包内的文件实体对象
+                ZipEntry entry = (ZipEntry) enumeration.nextElement();
+                String name = entry.getName();
+                if (entry.isDirectory()) {
+                    continue;
+                }
+                try (BufferedInputStream inputStream = new BufferedInputStream(zipFile.getInputStream(entry))) {
+                    // 需要判断文件所在的目录是否存在,处理压缩包里面有文件夹的情况
+                    String outName = targetPath + "/" + name;
+                    File outFile = new File(outName);
+                    File tempFile = new File(outName.substring(0, outName.lastIndexOf("/")));
+                    if (!tempFile.exists()) {
+                        tempFile.mkdirs();
+                    }
+                    try (BufferedOutputStream outputStream = new BufferedOutputStream(new FileOutputStream(outFile))) {
+                        int len;
+                        byte[] buffer = new byte[1024];
+                        while ((len = inputStream.read(buffer)) > 0) {
+                            outputStream.write(buffer, 0, len);
+                        }
+                    }
+
+                }
+
+            }
+
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+    public static void main(String[] args) throws Exception{
+//        String filePath = "/var/folders/88/jh37h0fj59l1f302jdryz4780000gn/T/201908月小微平台消耗-1574300435525/";
+//        // 需要压缩的文件夹名
+//        String fileName = "201908月小微平台消耗-1574300435525";
+//        // 压缩完成后保存为Test.zip文件,名字随意
+//        String outPath = "/var/folders/88/jh37h0fj59l1f302jdryz4780000gn/T/Test3.zip";
+//        zipFile(filePath, fileName, outPath);
+
+        String sourcePath = "C:\\gitproject\\manHourHousekeeper\\fhKeeper\\formulahousekeeper\\timesheet-workshop\\distPC.zip";
+        String targetPath = "C:\\文档资料\\distPC";
+        unzip(sourcePath, targetPath);
+    }
+}

+ 1 - 1
fhKeeper/formulahousekeeper/management-workshop/src/main/resources/mapper/ProdProcedureTeamMapper.xml

@@ -27,7 +27,7 @@
 
     <select id="getReportForWorkList" resultType="java.util.HashMap" >
         SELECT a.*, plan_procedure_total.plan_id, plan_procedure_total.prod_procedure_id,plan_procedure_total.total_working_hours,plan_procedure_total.total_wages, date_format(plan.`start_date`,'%Y-%m-%d') as start_date, date_format(plan.`end_date`,'%Y-%m-%d') as end_date, plan.`plan_type`,
-        plan.`product_scheduling_num`,plan.task_type_name,plan.task_name,plan.task_change_notice_num,
+        plan.`product_scheduling_num`,plan.task_type_name,plan.task_name,plan.task_change_notice_num,prod_procedure.seq,
         product.`name` AS product_name,prod_procedure.name AS procedure_name, prod_procedure.check_type, plan.check_type as plan_check_type,plan.vehicle_num_start,plan.vehicle_num_end,plan.num,
         (case when (select count(1) from report where user_procedure_team_id=a.id and creator_id=#{userId} and create_date=DATE_FORMAT(DATE(NOW()),'%Y-%m-%d'))>0 then 1 else 0 end ) isReported
         FROM prod_procedure_team a

+ 2 - 1
fhKeeper/formulahousekeeper/management-workshop/src/main/resources/mapper/ProductMapper.xml

@@ -10,6 +10,7 @@
         <result column="company_id" property="companyId" />
         <result column="category_name" property="categoryName" />
         <result column="code" property="code" />
+        <result column="project_name" property="projectName" />
         <result column="group_number" property="groupNumber" />
         <result column="order_number" property="orderNumber" />
         <result column="unit" property="unit" />
@@ -21,7 +22,7 @@
 
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
-        id, name, category_id, company_id, category_name, code, group_number, order_number, unit, column_number, vehicle_number, description, status
+        id, name, category_id, company_id, category_name, code, project_name, group_number, order_number, unit, column_number, vehicle_number, description, status
     </sql>
 
 </mapper>

+ 32 - 5
fhKeeper/formulahousekeeper/management-workshop/src/main/resources/mapper/ReportMapper.xml

@@ -115,7 +115,7 @@
 
     <!-- 批量获取员工某天的报告 -->
     <select id="getUserReportByDate" resultMap="FullMap">
-        select a.*,b.name as productName,prod_procedure.name as procedureName,checker.name as checkerName,u.name as creatorName,
+        select a.*,b.name as productName,prod_procedure.name as procedureName,prod_procedure.seq,checker.name as checkerName,u.name as creatorName,
         plan.task_type_name,plan.task_name,plan.task_change_notice_num,plan.product_scheduling_num,plan.plan_type,plan.start_date,plan.end_date
         FROM report AS a
         left JOIN product AS b ON a.product_id=b.id
@@ -135,7 +135,11 @@
     </select>
 
     <select id="getPersonWorkHoursWagesList" resultType="java.util.Map">
-        select b.id AS userId,c.department_name AS departmentName,b.name AS userName,DATE_FORMAT(a.create_date,'%Y%m%d') AS crateDate,IFNULL(SUM(a.cost),0) AS cost,IFNULL(SUM(a.working_time),0) AS workTime
+        select b.id AS userId,c.department_name AS departmentName,b.name AS userName,DATE_FORMAT(a.create_date,'%Y%m%d') AS crateDate,
+        IFNULL(SUM(IF(a.`user_procedure_team_id`IS NOT NULL,a.cost,NULL)),0) AS cost,
+        IFNULL(SUM(IF(a.`user_procedure_team_id` IS NOT NULL,a.working_time,NULL)),0) AS workTime,
+        IFNULL(SUM(IF(a.`user_procedure_team_id`IS NULL,a.cost,NULL)),0) AS tempCost,
+        IFNULL(SUM(IF(a.`user_procedure_team_id` IS NULL,a.working_time,NULL)),0) AS tempWorkTime
         from report a
         left join user b on a.creator_id=b.id
         left join department c on c.department_id=b.department_id
@@ -185,6 +189,28 @@
             and r.create_date between #{startDate} and #{endDate}
         </if>
     </select>
+
+    <select id="getPersonWorkHoursWagesDetailForTemp" resultType="java.util.Map">
+        select r.cost,r.working_time,r.finish_num, r.creator_id,DATE_FORMAT(r.create_date,'%Y%m%d') as createDate,
+        p.name as productName,DATE_FORMAT(plan.start_date,'%Y%m%d') as planStartDate,DATE_FORMAT(plan.end_date,'%Y%m%d') as planEndDate ,
+        plan.task_change_notice_num as taskChangeNoticeNum,plan.plan_type as planType,u.name as checkerName,u2.name as creatorName,plan.task_name as taskName
+        from report r
+        left join product p on p.id=r.product_id
+        left join plan on plan.id=r.plan_id
+        left join user u on r.checker_id=u.id
+        left join user u2 on r.creator_id=u2.id
+        where r.company_id=#{companyId}  and r.user_procedure_team_id is null
+        <if test="date!=null and date!=''">
+            and r.create_date=#{date}
+        </if>
+        <if test="userId!=null and userId!=''">
+            and r.creator_id=#{userId}
+        </if>
+        <if test="startDate!=null and endDate!=null">
+            and r.create_date between #{startDate} and #{endDate}
+        </if>
+    </select>
+
     <!--修改前 人员工时工价表详情数据-->
     <select id="getPersonWorkHoursWagesDetail" resultType="java.util.Map">
         select r.cost,r.working_time,r.finish_num as finish_num, r.creator_id,ppt.total_progress as progress,DATE_FORMAT(r.create_date,'%Y%m%d') as createDate,pp.name as procedureName,(case  when pp.check_type=0 then '自检' when pp.check_type=1 then '互检' else '专检' end) as checkType,
@@ -361,11 +387,11 @@
         b.foreman_name as userName,IFNULL(ROUND(SUM(a.total_working_hours),2),0) as planWorkTime,IFNULL(ROUND(SUM(a.total_wages),2),0)  as planCost,
         IFNULL(ROUND(SUM(a.`total_fill_time`),2),0) AS nowWorkTime,
         IFNULL(ROUND(SUM(a.`total_wages`*a.`total_progress`/100),2),0) AS nowCost,
-        b.product_name as productName,b.num as planNum,DATE_FORMAT(b.start_date,'%Y%m%d') as startDate,DATE_FORMAT(b.end_date,'%Y%m%d') as endDate,DATE_FORMAT(b.real_end_date,'%Y%m%d') as realEndDate,b.station_name as statinoName
+        b.product_name as productName,b.project_name as projectName,b.num as planNum,DATE_FORMAT(b.start_date,'%Y%m%d') as startDate,DATE_FORMAT(b.end_date,'%Y%m%d') as endDate,DATE_FORMAT(b.real_end_date,'%Y%m%d') as realEndDate,b.station_name as statinoName
         from plan b
         left join plan_procedure_total a on a.plan_id=b.id
         left join user u on u.id=b.station_id
-        where b.company_id=#{companyId}
+        where b.company_id=#{companyId} and b.plan_type=0
         <if test="userId!=null and userId!=''">
             and b.foreman_id=#{userId}
         </if>
@@ -514,7 +540,8 @@
         LEFT JOIN department dd ON d.superior_id=dd.department_id
         <where>
             p.status!=2 and
-            p.company_id=#{companyId}
+            p.company_id=#{companyId} and
+            p.plan_type=0
             <if test="startDate!=null and startDate!='' and endDate!=null and endDate!=''">
                 and p.start_date between #{startDate} and #{endDate}
             </if>

+ 17 - 0
fhKeeper/formulahousekeeper/management-workshop/src/main/resources/mapper/WxCorpTemplateMapper.xml

@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.management.platform.mapper.WxCorpTemplateMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.management.platform.entity.WxCorpTemplate">
+        <id column="company_id" property="companyId" />
+        <result column="template_id" property="templateId" />
+        <result column="type" property="type" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        company_id, template_id, type
+    </sql>
+
+</mapper>

+ 13 - 9
fhKeeper/formulahousekeeper/timesheet-workshop-h5/src/views/planView/component/planComponent.vue

@@ -20,6 +20,9 @@
                 <div class="PlanItem">
                   <div>项目代码:</div><span>{{ item.product.code }}</span>
                 </div>
+                <div class="PlanItem">
+                  <div>项目名称:</div><span>{{ item.product.projectName }}</span>
+                </div>
                 <div class="PlanItem">
                   <div>计划总工价:</div><span class="textBeyondHiding">{{item.totalMoney}}</span>
                 </div>
@@ -287,26 +290,27 @@ export default {
         flex-wrap: wrap;
 
         .PlanItem {
-          width: 50%;
+          // width: 50%;
           display: flex;
           padding-top: 8px;
 
-          &:first-child {
-            width: 100%;
+          // &:first-child {
+          //   width: 100%;
 
-            span {
-              width: 200px;
-              word-break: break-all;
-            }
-          }
+          //   span {
+          //     width: 200px;
+          //     word-break: break-all;
+          //   }
+          // }
 
           div {
-            width: 100px;
+            width: 110px;
             text-align: right;
             color: #666;
           }
 
           span {
+            flex: 1;
             display: inline-block;
             color: #333;
           }

+ 16 - 6
fhKeeper/formulahousekeeper/timesheet-workshop-h5/src/views/planView/todayPlan/distribution.vue

@@ -2,18 +2,22 @@
 <div>
   <div class="distribution">
     <van-nav-bar :title="titleText" left-text="返回" :right-text="!todayAndTomorrow ? '下发计划' : ''" @click-left="back" @click-right="placeAnOrder" fixed left-arrow/>
-    <div class="distribution_header">
-      <div>{{ productName }}</div>
-      <div>{{ productSchedulingNum }}</div>
-      <div>{{ dates }}</div>
+    <div style="display: flex;justify-content: space-between;">
+      <div class="distribution_header">
+        <div>{{ productName }}</div>
+        <div>{{ productSchedulingNum }}</div>
+        <div>{{ dates }}</div>
+      </div>
+      <van-button @click="batchUnReceive()" :disabled="!isCanAgree || distributionList.length == 0" type="info" size="small">批量拒收</van-button>
     </div>
+    
     <div class="distribution_con contentRoll">
       <div class="distribution_box" v-for="item,index in distributionList" :key="index">
         <div class="distribution_ItemBom">
           <van-checkbox v-if="todayAndTomorrow" :disabled="item.checkboxDisabled  || item.teamNames.indexOf(user.name) == -1"  v-model="item.prodProcedure.isSelected"  @click="itemChecked" shape="square">
           </van-checkbox>
           <div class="PlanItem">
-            <span>{{ item.prodProcedure.name }}</span>
+            <span>{{item.prodProcedure.seq}}. {{ item.prodProcedure.name }}</span>
           </div>
           <div class="PlanItem">
             <div>单件工价:</div><span class="textBeyondHiding">{{ item.prodProcedure.unitPrice }}</span>
@@ -73,7 +77,6 @@
         <van-checkbox v-model="isAllChecked" :disabled="distributionList.length == 0" @click="allChecked" shape="square" style="padding-left:3vw"></van-checkbox>
         <div style="padding:1vh 2vw">
         <van-button style="margin-right: 10px;" @click="batchReceive()" :disabled="!isCanAgree || distributionList.length == 0" type="info" size="small">批量接收</van-button>
-        <van-button @click="batchUnReceive()" :disabled="!isCanAgree || distributionList.length == 0" type="info" size="small">批量拒收</van-button>
         <!-- <van-button @click="cancellationReceiveBatch()" :disabled="!isCanAgree || distributionList.length == 0" type="info" size="small">批量取消接收</van-button> -->
         <!-- <van-button @click="batchAgree(false)" :disabled="!isCanAgree || distributionList.length == 0" type="danger" size="small" style="margin-left:2vw">批量驳回</van-button> -->
         </div>
@@ -178,13 +181,20 @@ export default {
     },
     // 批量操作
     allChecked(){
+        let status=false
         if(this.isAllChecked){
             for(let i in this.distributionList){
                 if(this.distributionList[i].teamNames&&this.distributionList[i].teamNames.indexOf(this.user.name) != -1){
                   this.distributionList[i].prodProcedure.isSelected = true
+                  status=true
                 }
             }
             this.isCanAgree = true
+            if(!status){
+              this.$toast.success('当前不存在可以接受/拒收工序');
+              this.isCanAgree = false
+              this.isAllChecked=false
+            }
         }else{
             for(let i in this.distributionList){
                 this.distributionList[i].prodProcedure.isSelected = false

+ 5 - 3
fhKeeper/formulahousekeeper/timesheet-workshop-h5/src/views/workView/fillReport.vue

@@ -37,13 +37,13 @@
               <van-stepper v-model="reportForm.finishNum" step="0.1" :min="0" :max="reportForm.num" :decimal-length="2" @change="onFinishNumChange"/>
             </template>
           </van-cell>
-          <van-cell title="完成全部工作" >
+          <!-- <van-cell title="完成全部工作" >
             <template>
               <div style="float:right;">
                 <van-checkbox v-model="reportForm.isFinish" />
               </div>
             </template>
-          </van-cell>
+          </van-cell> -->
           <van-cell title="中止工作" v-if="!reportForm.isFinish">
             <template>
               <div style="float:right;">
@@ -156,7 +156,9 @@ export default {
       //件数发生改变时,检测如果和计划总件数一样,则算完成
       if (this.reportForm.finishNum == this.reportForm.num) {
           this.$set(this.reportForm, 'isFinish',true);
-      } 
+      } else {
+         this.$set(this.reportForm, 'isFinish',false);
+      }
     },
     back() {
       this.$router.go(-1);

+ 2 - 1
fhKeeper/formulahousekeeper/timesheet-workshop-h5/src/views/workView/workView.vue

@@ -47,7 +47,7 @@
             <div v-if="reportBoolean" class="marginBtnPro">{{ item.productSchedulingNum }}</div>
             <div>
               <van-row>
-                <van-col span="19">{{ prod.plan_type == 0 ? item.procedure_name : prod.task_change_notice_num }}</van-col>
+                <van-col span="19">{{item.seq}}. {{ prod.plan_type == 0 ? item.procedure_name : prod.task_change_notice_num }}</van-col>
                 <van-col span="5" style="text-align:right;"><span style="color:goldenrod;font-size:16px;">{{ item.work_time
                 }}</span> <span style="font-size:12px;">分钟</span></van-col>
               </van-row>
@@ -257,6 +257,7 @@ export default {
             job_of_money: item.jobOfMoney,
             plan_check_type: item.planCheckType,
             procedure_name: item.procedureName,
+            seq: item.seq,
             progress: item.progress,
             work_time: item.workingTime,
             finishNum: item.finishNum,

+ 71 - 7
fhKeeper/formulahousekeeper/timesheet-workshop/src/views/plan/planComponent.vue

@@ -151,19 +151,22 @@
           <el-form-item label="生产订单号" style="width: 100%" prop="productOrderNum">
             <el-input v-model="todayPlanForm.productOrderNum" maxlength="50"></el-input>
           </el-form-item>
+          <el-form-item label="项目名称" style="width: 100%" prop="projectName">
+            <!-- <el-input :disabled="todayPlanForm.id==null?false:true"  v-model="todayPlanForm.projectName" maxlength="50" @blur="filterProductList(todayPlanForm.projectName)"></el-input> -->
+            <el-select :disabled="todayPlanForm.id==null?false:true" filterable remote reserve-keyword :remote-method="getProjectNames" @change="filterProductList(todayPlanForm.projectName)" v-model="todayPlanForm.projectName" placeholder="请输入项目名称" class="w100">
+              <el-option v-for="item in projectNameList" :key="item.label" :label="item.value" :value="item.value">
+              </el-option>
+            </el-select> 
+          </el-form-item>
           <el-form-item label="产品名称" style="width: 100%" prop="productId">
             <el-select :disabled="todayPlanForm.id==null?false:true" v-model="todayPlanForm.productId" placeholder="请选择" class="w100" @change="setProductCode" filterable>
               <el-option v-for="item in productList" :key="item.id" :label="item.name" :value="item.id">
               </el-option>
-            </el-select>
+            </el-select>  
           </el-form-item>
           <el-form-item label="项目代码" style="width: 100%" prop="projectCode">
             <el-input :disabled="todayPlanForm.id==null?false:true" v-model="todayPlanForm.projectCode" maxlength="50" readonly></el-input>
           </el-form-item>
-          <el-form-item label="项目名称" style="width: 100%" prop="projectName">
-            <el-input  v-model="todayPlanForm.projectName" maxlength="50" ></el-input>
-          </el-form-item>
-
           <div v-for="(item, index) in todayPlanForm.steelStampNumberList" style="width: 100%;margin-bottom: 10px;">
             <el-form-item label="钢印号" :key="index" style="width: 100%" prop="steelStampNumberStart">
               <el-input class="w45" v-model="item.steelStampNumberStart" maxlength="20"></el-input>
@@ -441,6 +444,7 @@ export default {
       exportParam: { productId: null, rangeDatas: this.getCurrentRangeTime() },
       searchType:'1',
       searchValue:'',
+      projectNameList:[]
     };
   },
   computed: {},
@@ -471,6 +475,34 @@ export default {
         ruleIndexEnd: '',
       });   // 在数组中添加一个空对象
     },
+    filterProductList(value){
+      this.todayPlanForm.productId=null,
+      this.todayPlanForm.projectCode=null,
+      this.http.post(
+          "/product/getProductPage",
+          {
+            pageIndex: null,
+            pageSize: null,
+            projectName:value
+          },
+          (res) => {
+            if (res.code == "ok") {
+              this.productList = res.data.records;
+            } else {
+              this.$message({
+                message: res.msg,
+                type: "error",
+              });
+            }
+          },
+          (error) => {
+            this.$message({
+              message: error,
+              type: "error",
+            });
+          }
+        );
+    },
     deleteInput(index) {
       this.todayPlanForm.steelStampNumberList.splice(index, 1)
     },
@@ -500,8 +532,12 @@ export default {
     setProductCode() {
       let arrList = this.productList.filter(item => item.id == this.todayPlanForm.productId)
       console.log('====>', arrList)
-      this.todayPlanForm.projectCode = arrList[0].code
-      this.todayPlanForm.productName = arrList[0].name
+      // this.todayPlanForm.projectCode = arrList[0].code
+      // this.todayPlanForm.projectName = arrList[0].projectName
+      // this.todayPlanForm.productName = arrList[0].name
+      this.$set(this.todayPlanForm, "projectCode", arrList[0].code)
+      // this.$set(this.todayPlanForm, "projectName", arrList[0].projectName)
+      this.$set(this.todayPlanForm, "productName", arrList[0].name)
     },
     today() {
       let date = new Date();
@@ -704,6 +740,34 @@ export default {
       this.hasChooseDept = item.departmentId;
       this.getTableData(item.departmentId);
     },
+    getProjectNames(value){
+      if(value != '') {
+        this.http.post(
+          "/product/getProductProjectNames",
+          {
+            value:value,
+          },
+          (res) => {
+            if (res.code == "ok") {
+              this.projectNameList = res.data;
+            } else {
+              this.$message({
+                message: res.msg,
+                type: "error",
+              });
+            }
+          },
+          (error) => {
+            this.$message({
+              message: error,
+              type: "error",
+            });
+          }
+        );
+      } else {
+        this.projectNameList = []
+      }
+    },
     // 获取车间数据
     getTableData(departmentId) {
       console.log(this.planDate, departmentId);

+ 5 - 4
fhKeeper/formulahousekeeper/timesheet-workshop/src/views/plan/planComponentDetil.vue

@@ -29,10 +29,11 @@
           :height="tableHight"
           v-if="TabIndex == 0" v-loading="tableDataLoading"
         >
-        <el-table-column
-          type="index"
-          width="50">
-        </el-table-column>
+        <el-table-column label="序号" width="60">
+            <template slot-scope="scope">{{
+              scope.row.prodProcedure.seq
+            }}</template>
+          </el-table-column>
           <el-table-column label="工序名称" width="400">
             <template slot-scope="scope">
                 <div class="disFlexscope">

+ 7 - 4
fhKeeper/formulahousekeeper/timesheet-workshop/src/views/product/list.vue

@@ -70,10 +70,7 @@
                             </el-form-item>
                             <el-form-item>
                                 <el-table :data="props.row.tableProdProcedure.procedureList" border style="width: 100%">
-                                    <el-table-column
-                                        type="index"
-                                        width="50">
-                                    </el-table-column>
+                                    <el-table-column prop="seq" label="序号" width="60"></el-table-column>
                                     <el-table-column prop="name" label="工序名称" width="180">
                                     </el-table-column>
                                     <el-table-column prop="workingTime" label="单件工时" width="180">
@@ -128,6 +125,7 @@
             <el-table-column type="selection" width="55">
             </el-table-column>
             <el-table-column prop="name" label="产品名称"  width="300"></el-table-column>
+            <el-table-column prop="projectName" label="项目名称" width="200"></el-table-column>
             <el-table-column prop="code" label="项目代码" width="200"></el-table-column>
             <el-table-column prop="orderNumber" label="订单数量" width="100"></el-table-column>
             <el-table-column prop="unit" label="单位" width="100"></el-table-column>
@@ -191,6 +189,10 @@
                         <el-input v-model="addForm.name" :placeholder="$t('peaseenterthe')" clearable maxlength="50"
                             show-word-limit="true"></el-input>
                     </el-form-item>
+                    <el-form-item label="项目名称" prop="projectName">
+                        <el-input v-model="addForm.projectName" :placeholder="$t('peaseenterthe')" clearable maxlength="50"
+                            show-word-limit="true"></el-input>
+                    </el-form-item>
                     <el-form-item label="项目代码" prop="code">
                         <!-- <el-input v-model="addForm.code" :disabled="!permissions.projectManagement && addForm.creatorId != user.id" placeholder="请输入项目编号" clearable></el-input> -->
                         <el-input v-model="addForm.code" :placeholder="$t('peaseenterthe')" clearable maxlength="50"
@@ -803,6 +805,7 @@ export default {
             rules: {
                 name: [{ required: true, message: this.$t('pleaseentername'), trigger: "blur" }],
                 code: [{ required: true, message: "请输入项目代码", trigger: "blur" }],
+                projectName: [{ required: true, message: "请输入项目名称", trigger: "blur" }],
                 orderNumber: [{ required: true, message:' 请输入订单数量', trigger: "blur" }],
                 unit: [{ required: true, message: '请输入单位', trigger: "blur" }],
                 groupNumber: [{ required: true, message: '请输入编组', trigger: "blur" }],

+ 56 - 6
fhKeeper/formulahousekeeper/timesheet-workshop/src/views/statistic/index.vue

@@ -88,11 +88,11 @@
                 <el-table-column align="center" prop="name" label="人员" min-width="100" fixed="left"></el-table-column>
                 <el-table-column v-for="(item, index) in personWorkHoursWagesHead" :key="index" :label="item" align="center" min-width="150">
                     <template slot-scope="scope">
-                        <div v-for="(items, indexs) in scope.row.personWorkHoursWages" :key="indexs" @click="showReportDetail(scope.row,item,0)" :class="`${scope.row.departmentCascade== '小计' ? '' : 'colorText'}`">
+                        <div v-for="(items, indexs) in scope.row.personWorkHoursWages" :key="indexs" :class="`${scope.row.departmentCascade== '小计' ? '' : 'colorText'}`">
                             <div v-if="items.crateDate == item">
                               <div  style="color: black;" v-if="items.planWorkTime">平均 {{items.planWorkTime}}分钟  {{items.planCost}}元</div>
-                              <div v-if="items.leave">{{items.leave}}</div>
-                              <div v-else>已填 {{items.workTime}}分钟  {{items.cost}}元</div> 
+                              <div @click.stop="showReportDetail(scope.row,item,0)" v-if="items.workTime>0">已填 {{items.workTime}}分钟  {{items.cost}}元 </div>{{items.leave}}
+                              <div style="color: green;" @click.stop="showTempReportDetail(scope.row,item,0)" v-if="items.tempWorkTime>0||items.tempCost>0">临时报工 {{items.tempWorkTime}}分钟  {{items.tempCost}}元</div>
                               <div style="color: red;" v-if="items.surplusTime">剩余 {{items.surplusTime}}分钟  {{items.surplusCost}}元</div>
                             </div>
                         </div>
@@ -100,11 +100,10 @@
                 </el-table-column>
                 <el-table-column align="center" prop="totalResult" label="合计" min-width="180">
                    <template slot-scope="scope" >
-                    <div @click="showReportDetail(scope.row,item,1)">
-                      <div  style="color: black;">平均 {{scope.row.totalPlanResult}}</div>
+                    <div style="color: black;">平均 {{scope.row.totalPlanResult}}</div>
                       <div style="color: #02a7f0;"  @click="showReportDetail(scope.row,item,1)">已填 {{scope.row.totalResult}}</div> 
+                      <div style="color: green;"  @click="showTempReportDetail(scope.row,item,1)">临时报工 {{scope.row.totalTempResult}}</div> 
                       <div style="color: red;">剩余 {{scope.row.totalSurplusResult}}</div>
-                    </div>
                   </template>
                 </el-table-column>
             </el-table>
@@ -160,6 +159,9 @@
                 <el-table-column align="center" prop="productName" label="产品名称" min-width="150">
                   <template slot-scope="scope">{{scope.row.productName}}</template>
                 </el-table-column>
+                <el-table-column align="center" prop="projectName" label="项目名称" min-width="150">
+                  <template slot-scope="scope">{{scope.row.projectName}}</template>
+                </el-table-column>
                 <el-table-column align="center" prop="startDate" label="开始日期" width="150">
                   <template slot-scope="scope">{{scope.row.startDate}}</template>
                 </el-table-column>
@@ -762,6 +764,15 @@ export default {
       this.detailUserId=row.id
       this.getPersonWorkHoursWagesDetail(item,viewAll)
     },
+    showTempReportDetail(row,item,viewAll){
+      if(row.departmentCascade=='小计'){
+          return
+      }
+      console.log(item)
+      this.reportDetailDialog=true
+      this.detailUserId=row.id
+      this.getPersonWorkHoursWagesDetailForTemp(item,viewAll)
+    },
     authorityToJudge() {
     //   if(this.permissions.reportProject || this.permissions.reportAllProject) {this.ssl(0);this.defaultActive = '1-1';return} else
     //   if(this.permissions.reportTask || this.permissions.reportAllTask) {this.ssl(1);this.defaultActive = '1-2';return} else
@@ -970,6 +981,45 @@ export default {
         });
       });
     },
+    getPersonWorkHoursWagesDetailForTemp(item,viewAll){
+      this.listLoading=true
+      let param={
+        userId:this.detailUserId
+      }
+      if(viewAll==1){
+        this.simpleDateChoose=''
+        param={
+          ...param,
+          startDate:this.rangeDatas[0],
+          endDate:this.rangeDatas[1]
+        }
+      }else{
+        this.simpleDateChoose=item
+        param={
+          ...param,
+          date: this.simpleDateChoose.substring(0,4)+"-"+this.simpleDateChoose.substring(4,6)+"-"+this.simpleDateChoose.substring(6,this.simpleDateChoose.length),
+        }
+      }
+      this.http.post( "/report/getPersonWorkHoursWagesDetailForTemp", param,
+      res => {
+        if (res.code == "ok") {
+          this.personWorkHoursWagesDetail=res.data.record
+          this.totalCost=res.data.totalCost
+          this.totalWorkingTime=res.data.totalWorkingTime
+        } else {
+          this.$message({
+            message: res.msg,
+            type: "error"
+          });
+        }
+        this.listLoading=false
+      },error => {
+        this.$message({
+          message: error,
+          type: "error"
+        });
+      });
+    },
     //工序实际工时表
     getProcedureRealTimeProgressList(){
       this.listLoading=true

+ 260 - 213
fhKeeper/formulahousekeeper/timesheet/src/views/centerManage/centerManage.vue

@@ -1,180 +1,222 @@
 <template>
-    <section >
+    <section>
+        <el-select v-model="value" filterable placeholder="请选择" :filter-method="aabbcc()">
+            <el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value">
+            </el-option>
+        </el-select>
         <el-col :span="24" class="toolbar" style="padding-bottom: 0px;">
             <el-form :inline="true">
                 <el-form-item :label="user.timeType.customDegreeName + $t('guan-li')">
-                    <el-input placeholder="请输入关键名称" v-model.trim="searchNameVal" clearable class="input-with-select" style="margin-left: 50px" @keyup.enter.native="searchName()">
+                    <el-input placeholder="请输入关键名称" v-model.trim="searchNameVal" clearable class="input-with-select"
+                        style="margin-left: 50px" @keyup.enter.native="searchName()">
                         <el-button slot="append" @click="searchName()">搜索</el-button>
                     </el-input>
                 </el-form-item>
-                
+
                 <!-- <el-link type="primary" :underline="false" @click="intoCenterRatio" class="tanjia">批量导入{{user.timeType.customDegreeName}}</el-link>
                 <el-link icon="el-icon-circle-plus-outline" type="primary" :underline="false" class="tanjia" @click="addNewSubProject()">添加{{user.timeType.customDegreeName}}</el-link>
                 <el-link type="primary" :underline="false" @click="batchDelete" class="tanjia">批量删除{{user.timeType.customDegreeName}}</el-link> -->
-                <el-link type="primary" :underline="false" @click="batchDelete" class="tanjia">{{ $t('Batchdelete') }}</el-link>
-                <el-link type="primary" :underline="false" @click="outoCenterRatio" class="tanjia">{{ $t('Exportdata') }}</el-link>
-                <el-link type="primary" :underline="false" @click="intoCenterRatio" class="tanjia">{{ $t('bulkimport') }}</el-link>
-                <el-link icon="el-icon-circle-plus-outline" type="primary" :underline="false" class="tanjia" @click="addNewSubProject()">{{ $t('add') }}</el-link>
+                <el-link type="primary" :underline="false" @click="batchDelete" class="tanjia">{{ $t('Batchdelete')
+                }}</el-link>
+                <el-link type="primary" :underline="false" @click="outoCenterRatio" class="tanjia">{{ $t('Exportdata')
+                }}</el-link>
+                <el-link type="primary" :underline="false" @click="intoCenterRatio" class="tanjia">{{ $t('bulkimport')
+                }}</el-link>
+                <el-link icon="el-icon-circle-plus-outline" type="primary" :underline="false" class="tanjia"
+                    @click="addNewSubProject()">{{ $t('add') }}</el-link>
 
             </el-form>
         </el-col>
-        <el-table :data="subProjectList" highlight-current-row v-loading="listLoading" :height="heightDoms" style="width: 100%;" @selection-change="selectionChange">
+        <el-table :data="subProjectList" highlight-current-row v-loading="listLoading" :height="heightDoms"
+            style="width: 100%;" @selection-change="selectionChange">
             <el-table-column type="selection"></el-table-column>
             <el-table-column prop="id" width="200" :label="$t('headerTop.serialNumber')" align="center">
-                <template slot-scope="scope" >
-                    {{scope.$index + 1}}
+                <template slot-scope="scope">
+                    {{ scope.$index + 1 }}
                 </template>
             </el-table-column>
             <el-table-column prop="name" :label="$t('names')" width="160" show-overflow-tooltip></el-table-column>
             <el-table-column prop="projectNum" :label="$t('numberofrelatedprojects')" width="160">
-                <template slot-scope="scope">{{scope.row.projectNum +  $t('ge')}}</template>
+                <template slot-scope="scope">{{ scope.row.projectNum + $t('ge') }}</template>
             </el-table-column>
-            <el-table-column prop="projects" :label="$t('relatedprojects')" min-width="180" show-overflow-tooltip></el-table-column>
+            <el-table-column prop="projects" :label="$t('relatedprojects')" min-width="180"
+                show-overflow-tooltip></el-table-column>
             <el-table-column prop="rmark" :label="$t('bei-zhu')" min-width="180" show-overflow-tooltip></el-table-column>
             <el-table-column :label="$t('operation')" width="170">
-                <template slot-scope="scope" >
-                    <el-button size="small" type="primary" @click="addNewSubProject(scope.row)">{{ $t('bian-ji') }}</el-button>
-                    <el-button size="small" type="danger" @click="deleteSubPro(scope.row)">{{ $t('btn.delete') }}</el-button>
+                <template slot-scope="scope">
+                    <el-button size="small" type="primary" @click="addNewSubProject(scope.row)">{{ $t('bian-ji')
+                    }}</el-button>
+                    <el-button size="small" type="danger" @click="deleteSubPro(scope.row)">{{ $t('btn.delete')
+                    }}</el-button>
                 </template>
             </el-table-column>
         </el-table>
-        <el-dialog :title="$t('addedormodifiedthemaintenancedata')" v-if="addSubProject" :visible.sync="addSubProject" :close-on-click-modal="false" customClass="customWidth" width="600px">
+        <el-dialog :title="$t('addedormodifiedthemaintenancedata')" v-if="addSubProject" :visible.sync="addSubProject"
+            :close-on-click-modal="false" customClass="customWidth" width="600px">
             <el-form ref="form2" :model="addfm" :rules="ruless" label-width="100px">
                 <el-form-item :label="$t('names')" prop="name">
                     <el-input v-model="addfm.name" :placeholder="$t('peaseenterthe')" clearable></el-input>
                 </el-form-item>
                 <el-form-item :label="$t('bei-zhu')">
-                    <el-input type="textarea" :rows="4" :placeholder="$t('peaseenterthe')" v-model="addfm.rmark" clearable  maxlength="150" show-word-limit> </el-input>
+                    <el-input type="textarea" :rows="4" :placeholder="$t('peaseenterthe')" v-model="addfm.rmark" clearable
+                        maxlength="150" show-word-limit> </el-input>
                 </el-form-item>
             </el-form>
             <div slot="footer" class="dialog-footer">
                 <el-button @click.native="addSubProject = false">{{ $t('btn.cancel') }}</el-button>
-                <el-button type="primary" @click="submitInsertSubProject" :loading="addLoading">{{ $t('btn.submit') }}</el-button>
+                <el-button type="primary" @click="submitInsertSubProject" :loading="addLoading">{{ $t('btn.submit')
+                }}</el-button>
             </div>
         </el-dialog>
         <!-- 导入结果说明 -->
-        <el-dialog :title="$t('importtheresults')" v-if="showImportResult" :visible.sync="showImportResult" customClass="customWidth" width="500px">
+        <el-dialog :title="$t('importtheresults')" v-if="showImportResult" :visible.sync="showImportResult"
+            customClass="customWidth" width="500px">
             <div>
-                <span>{{importResultMsg}}</span>
-                
+                <span>{{ importResultMsg }}</span>
+
             </div>
             <span slot="footer" class="dialog-footer">
-                <el-button type="primary" @click="showImportResult=false">{{ $t('btn.determine') }}</el-button>
-            </span> 
+                <el-button type="primary" @click="showImportResult = false">{{ $t('btn.determine') }}</el-button>
+            </span>
         </el-dialog>
         <!-- <span>{{ $t('importTemplate') }}</span> -->
-        <el-dialog :title="$t('dao-ru') + user.timeType.customDegreeName + $t('shu-ju')" v-if="intoCenterDialog" :visible.sync="intoCenterDialog" customClass="customWidth" width="500px">
+        <el-dialog :title="$t('dao-ru') + user.timeType.customDegreeName + $t('shu-ju')" v-if="intoCenterDialog"
+            :visible.sync="intoCenterDialog" customClass="customWidth" width="500px">
             <p>1. {{ $t('other.download') }}
-            <el-link type="primary" style="margin-left:5px;" :underline="false" href="./upload/研究中心导入模板.xlsx" :download="user.timeType.customDegreeName+ $t('importTemplate') +'.xlsx'">{{user.timeType.customDegreeName + $t('importTemplate')}}.xlsx</el-link>
+                <el-link type="primary" style="margin-left:5px;" :underline="false" href="./upload/研究中心导入模板.xlsx"
+                    :download="user.timeType.customDegreeName + $t('importTemplate') + '.xlsx'">{{
+                        user.timeType.customDegreeName
+                        + $t('importTemplate') }}.xlsx</el-link>
             </p>
             <!-- <p>2. 填写excel模板,请确保模板中的项目和人员已添加到系统中。</p> -->
             <p style="display: flex;justify-content: center;padding:1em 0">
-                <el-upload ref="upload"  action="#" :limit="1" :http-request="batchImportData" :show-file-list="false">
-                <el-button type="primary" :underline="false" :loading="importingData">{{ $t('other.startImporting') }}</el-button>
-            </el-upload>
+                <el-upload ref="upload" action="#" :limit="1" :http-request="batchImportData" :show-file-list="false">
+                    <el-button type="primary" :underline="false" :loading="importingData">{{ $t('other.startImporting')
+                    }}</el-button>
+                </el-upload>
             </p>
         </el-dialog>
     </section>
 </template>
 <script>
-    export default {
-        data() {
-            return {
-                user: JSON.parse(sessionStorage.getItem("user")),
-                listLoading: false,
-                addfm: {
-                    name: '',
-                    rmark: ''
-                },
-                addSubProject: false,
-                ruless: {
-                    name: [{ required: true, message: this.$t('pleaseentername'), trigger: "blur" }],
-                },
-                heightDoms: document.documentElement.clientHeight - 140,
-                intoCenterDialog:false,
-                importingData: false,
-                importResultMsg:null,
-                showImportResult:false,
-                selectionArr: [],
-                subProjectList: [],//子项目列表
-                subProjectListArr: [], // 备用列表
-                searchNameVal: ''
-            };
-        },
-        methods: {
-            searchName() {
-                var val = this.searchNameVal
-                let arr = []
-                if(val) {
-                    arr =  this.subProjectListArr.filter((num)=>{
-                        if(num.name.indexOf(val) != '-1') {
-                            return num
-                        }
-                    })
-                    this.subProjectList = arr
-                } else {
-                    this.subProjectList = this.subProjectListArr
-                }
-                
+export default {
+    data() {
+        return {
+            user: JSON.parse(sessionStorage.getItem("user")),
+            listLoading: false,
+            addfm: {
+                name: '',
+                rmark: ''
             },
-            // 批量删除
-            selectionChange(selection){
-                this.selectionArr = selection
-                console.log(this.selectionArr);
+            addSubProject: false,
+            ruless: {
+                name: [{ required: true, message: this.$t('pleaseentername'), trigger: "blur" }],
             },
-            batchDelete(){
-                if(this.selectionArr.length == 0){
-                    this.$message(this.$t('pleaseselectheonesyouwanttodelete') + this.user.timeType.customDegreeName + this.$t('shu-ju'))
-                    return
-                }else{
-                    let nametext = ''
-                    for(let i in this.selectionArr){
-                        nametext += this.selectionArr[i].name + '、'
+            heightDoms: document.documentElement.clientHeight - 140,
+            intoCenterDialog: false,
+            importingData: false,
+            importResultMsg: null,
+            showImportResult: false,
+            selectionArr: [],
+            subProjectList: [],//子项目列表
+            subProjectListArr: [], // 备用列表
+            searchNameVal: '',
+            options: [{
+                value: '选项1',
+                label: '黄金糕'
+            }, {
+                value: '选项2',
+                label: '双皮奶'
+            }, {
+                value: '选项3',
+                label: '蚵仔煎'
+            }, {
+                value: '选项4',
+                label: '龙须面'
+            }, {
+                value: '选项5',
+                label: '北京烤鸭'
+            }],
+            value: ''
+        };
+    },
+    methods: {
+        aabbcc() {
+            console.log(12345)
+        },  
+        searchName() {
+            var val = this.searchNameVal
+            let arr = []
+            if (val) {
+                arr = this.subProjectListArr.filter((num) => {
+                    if (num.name.indexOf(val) != '-1') {
+                        return num
                     }
-                    nametext = nametext.substring(0,nametext.length - 1)
-                    this.$confirm(this.$t('makesuretodeleteinbatches') + this.user.timeType.customDegreeName + this.$t('shu-ju') +':' + nametext + '\u3000' + $t('ma'),this.$t('btn.delete'),{
-                        confirmButtonText: this.$t('btn.determine'),
-                        cancelButtonText: this.$t('btn.cancel'),
-                        type: 'warning'
-                    }).then(()=>{
-                        let batchIds = ''
-                        for(let m in this.selectionArr){
-                            batchIds += this.selectionArr[m].id + ','
-                        }
-                        batchIds = batchIds.substring(0,batchIds.length - 1)
-                        this.http.post('/report-extra-degree/batchDelete',{
-                            batchIds
-                        },res => {
-                            if(res.code == 'ok'){
-                                this.$message({
-                                    message: this.$t('message.successfullyDeleted'),
-                                    type: 'success'
-                                })
-                                this.getSub()
-                            }else {
-                                this.$message({
-                                    message: res.msg,
-                                    type: 'error'
-                                })
-                            }
-                        },err => {
+                })
+                this.subProjectList = arr
+            } else {
+                this.subProjectList = this.subProjectListArr
+            }
+
+        },
+        // 批量删除
+        selectionChange(selection) {
+            this.selectionArr = selection
+            console.log(this.selectionArr);
+        },
+        batchDelete() {
+            if (this.selectionArr.length == 0) {
+                this.$message(this.$t('pleaseselectheonesyouwanttodelete') + this.user.timeType.customDegreeName + this.$t('shu-ju'))
+                return
+            } else {
+                let nametext = ''
+                for (let i in this.selectionArr) {
+                    nametext += this.selectionArr[i].name + '、'
+                }
+                nametext = nametext.substring(0, nametext.length - 1)
+                this.$confirm(this.$t('makesuretodeleteinbatches') + this.user.timeType.customDegreeName + this.$t('shu-ju') + ':' + nametext + '\u3000' + $t('ma'), this.$t('btn.delete'), {
+                    confirmButtonText: this.$t('btn.determine'),
+                    cancelButtonText: this.$t('btn.cancel'),
+                    type: 'warning'
+                }).then(() => {
+                    let batchIds = ''
+                    for (let m in this.selectionArr) {
+                        batchIds += this.selectionArr[m].id + ','
+                    }
+                    batchIds = batchIds.substring(0, batchIds.length - 1)
+                    this.http.post('/report-extra-degree/batchDelete', {
+                        batchIds
+                    }, res => {
+                        if (res.code == 'ok') {
                             this.$message({
-                                message: err,
+                                message: this.$t('message.successfullyDeleted'),
+                                type: 'success'
+                            })
+                            this.getSub()
+                        } else {
+                            this.$message({
+                                message: res.msg,
                                 type: 'error'
                             })
+                        }
+                    }, err => {
+                        this.$message({
+                            message: err,
+                            type: 'error'
                         })
                     })
-                }
-            },
+                })
+            }
+        },
 
 
-            intoCenterRatio(){
-                this.intoCenterDialog=true;
-            },
-            outoCenterRatio(){
-                this.http.post('/report-extra-degree/exportData',{},
+        intoCenterRatio() {
+            this.intoCenterDialog = true;
+        },
+        outoCenterRatio() {
+            this.http.post('/report-extra-degree/exportData', {},
                 res => {
-                    if(res.code == 'ok'){
+                    if (res.code == 'ok') {
                         let filePath = res.data;
                         let fileName = filePath.split('/upload/')[1]
                         const a = document.createElement('a'); // 创建a标签
@@ -182,43 +224,43 @@
                         a.setAttribute('href', filePath);// href链接
                         a.click(); //自执行点击事件
                         a.remove();
-                    }else{
+                    } else {
                         this.$message({
                             message: res.msg,
                             type: 'error'
                         })
                     }
-                },err => {
+                }, err => {
                     this.$message({
                         message: err,
                         type: 'error'
                     })
                 })
-            },
-            batchImportData(item) {
-                //首先判断文件类型
-                let str = item.file.name.split(".");
-                let format = str[str.length - 1];
-                if (format != "xls" && format != "xlsx") {
-                    this.$message({
-                        message: this.$t('other.PleaseselecttheXLSorXLSXfile'),
-                        type: "error"
-                    });
-                } else {
-                    this.importingData = true;
-                    let formData = new FormData();
-                    formData.append("file", item.file);  
-                    this.http.uploadFile('/report-extra-degree/importData', formData,
+        },
+        batchImportData(item) {
+            //首先判断文件类型
+            let str = item.file.name.split(".");
+            let format = str[str.length - 1];
+            if (format != "xls" && format != "xlsx") {
+                this.$message({
+                    message: this.$t('other.PleaseselecttheXLSorXLSXfile'),
+                    type: "error"
+                });
+            } else {
+                this.importingData = true;
+                let formData = new FormData();
+                formData.append("file", item.file);
+                this.http.uploadFile('/report-extra-degree/importData', formData,
                     res => {
                         this.$refs.upload.clearFiles();
                         this.importingData = false;
                         this.showImportResult = true;
                         if (res.code == "ok") {
                             //换成弹出框,以免有人等了半天回来啥也没看到
-                            this.importResultMsg = this.$t('importedupdatedsuccessfully')+res.data+this.$t('customersdata')+"。"+(res.msg?res.msg:"");
+                            this.importResultMsg = this.$t('importedupdatedsuccessfully') + res.data + this.$t('customersdata') + "。" + (res.msg ? res.msg : "");
                             this.getSub();
                         } else {
-                            this.importResultMsg = this.$t('export.Importfailure') + ":"+res.msg;
+                            this.importResultMsg = this.$t('export.Importfailure') + ":" + res.msg;
                         }
                     },
                     error => {
@@ -229,11 +271,11 @@
                             type: "error"
                         });
                     });
-                }
-            },
-            getSub() {
-                this.listLoading = true;
-                this.http.post('/report-extra-degree/getAll ',{withProjects:1},
+            }
+        },
+        getSub() {
+            this.listLoading = true;
+            this.http.post('/report-extra-degree/getAll ', { withProjects: 1 },
                 res => {
                     this.listLoading = false;
                     if (res.code == "ok") {
@@ -253,70 +295,70 @@
                         message: error,
                         type: "error"
                     });
-                    }
-                );
-            },
-            addNewSubProject(subProject) {
-                // console.log(1234)
-                // if (subProject == null) {
-                //     this.addForm = {projectId: this.currentProject.id, level:1}
-                // } 
-                // else {
-                //     this.addForm = subProject;
-                // }
-                if(subProject) {
-                    this.addfm.name = subProject.name
-                    this.addfm.id = subProject.id
-                    this.addfm.rmark = subProject.rmark
-                } else {
-                    this.addfm = {name: '',rmark: ''}
                 }
-                this.addSubProject = true;
-            },
-            deleteSubPro(subProject) {
-                this.$confirm(this.$t('makesuretodeletethisone') + subProject.name + this.$t('shu-ju'),this.$t('btn.delete'), {
-                    confirmButtonText: this.$t('btn.determine'),
-                    cancelButtonText: this.$t('btn.cancel'),
-                    type: "warning"
-                })
+            );
+        },
+        addNewSubProject(subProject) {
+            // console.log(1234)
+            // if (subProject == null) {
+            //     this.addForm = {projectId: this.currentProject.id, level:1}
+            // } 
+            // else {
+            //     this.addForm = subProject;
+            // }
+            if (subProject) {
+                this.addfm.name = subProject.name
+                this.addfm.id = subProject.id
+                this.addfm.rmark = subProject.rmark
+            } else {
+                this.addfm = { name: '', rmark: '' }
+            }
+            this.addSubProject = true;
+        },
+        deleteSubPro(subProject) {
+            this.$confirm(this.$t('makesuretodeletethisone') + subProject.name + this.$t('shu-ju'), this.$t('btn.delete'), {
+                confirmButtonText: this.$t('btn.determine'),
+                cancelButtonText: this.$t('btn.cancel'),
+                type: "warning"
+            })
                 .then(() => {
                     this.listLoading = true;
-                    this.http.post('/report-extra-degree/delete',{ 
-                        id: subProject.id 
+                    this.http.post('/report-extra-degree/delete', {
+                        id: subProject.id
                     },
-                    res => {
-                        this.listLoading = false;
-                        if (res.code == "ok") {
-                            this.$message({
-                                message: this.$t('message.successfullyDeleted'),
-                                type: "success"
-                            });
-                            this.getSub();
-                        } else {
-                            
+                        res => {
+                            this.listLoading = false;
+                            if (res.code == "ok") {
+                                this.$message({
+                                    message: this.$t('message.successfullyDeleted'),
+                                    type: "success"
+                                });
+                                this.getSub();
+                            } else {
+
                                 this.$message({
                                     message: res.msg,
                                     type: "error"
                                 });
-                            
-                        }
-                    },
-                    error => {
-                        this.listLoading = false;
-                        this.$message({
-                            message: error,
-                            type: "error"
-                        });
+
+                            }
+                        },
+                        error => {
+                            this.listLoading = false;
+                            this.$message({
+                                message: error,
+                                type: "error"
+                            });
                         }
                     );
                 })
-                .catch(() => {});
-            },
-            submitInsertSubProject() {
-                this.$refs.form2.validate(valid => {
-                    if (valid) {
-                        var slp = this.addfm
-                        this.http.post('/report-extra-degree/addOrMod',slp,
+                .catch(() => { });
+        },
+        submitInsertSubProject() {
+            this.$refs.form2.validate(valid => {
+                if (valid) {
+                    var slp = this.addfm
+                    this.http.post('/report-extra-degree/addOrMod', slp,
                         res => {
                             this.listLoading = false;
                             if (res.code == "ok") {
@@ -324,7 +366,7 @@
                                     message: this.$t('other.successful'),
                                     type: "success"
                                 });
-                                this.addfm = {name: '',rmark: ''}
+                                this.addfm = { name: '', rmark: '' }
                                 this.addSubProject = false
                                 this.getSub()
                             } else {
@@ -340,50 +382,55 @@
                                 message: error,
                                 type: "error"
                             });
-                            }
-                        );
-                    }
-                })
-            },
-        },
-        created() {
-            this.getSub()
+                        }
+                    );
+                }
+            })
         },
-        mounted() {
+    },
+    created() {
+        this.getSub()
+    },
+    mounted() {
 
-        }
-    };
+    }
+};
 </script>
 
 <style lang="scss" scoped>
 .addNode {
-  cursor:pointer;
+    cursor: pointer;
 }
+
 .addNode:hover {
-  color:#20a0ff;
+    color: #20a0ff;
 }
 
 .panel {
-    padding:30px 15px ;box-shadow: 0 2px 4px rgba(3, 3, 3, 0.12), 0 0 6px rgba(0, 0, 0, .04);
-    
+    padding: 30px 15px;
+    box-shadow: 0 2px 4px rgba(3, 3, 3, 0.12), 0 0 6px rgba(0, 0, 0, .04);
+
 }
+
 .sample {
-    margin-top:30px;
+    margin-top: 30px;
     color: #999;
 }
+
 .tip {
-    margin-left:10px; color:gray;
-    
+    margin-left: 10px;
+    color: gray;
+
 }
+
 .tanjia {
     float: right;
     box-sizing: border-box;
     margin: 10px 28px;
 }
-
 </style>
 <style>
-.el-tooltip__popper{
+.el-tooltip__popper {
     max-width: 600px;
 }
 </style>

+ 1 - 1
fhKeeper/formulahousekeeper/timesheet/src/views/settings/timetype.vue

@@ -440,7 +440,7 @@
             <span style="margin-left:10px;color:#999;">{{ $t('parametermandatory') }}</span>
         </div>
         <!-- 是否开启导入审核 -->
-        <div class="yanjiu">
+        <div class="yanjiu" v-if="timeType.importReportAuditNormal == 0">
             <p style="margin-left:10px;color:#666;">{{ $t('importauditing') }}</p>
             <el-switch style="margin-left: 55px" v-model="timeType.needDeptAudit" active-color="#20a0ff" > </el-switch>
             <span v-if="timeType.needDeptAudit == 1" style="margin-left:10px;color:#999;">{{ $t('eachdepartment') }}</span>

Файловите разлики са ограничени, защото са твърде много
+ 3 - 3
fhKeeper/formulahousekeeper/timesheet/src/views/workReport/daily.vue