Browse Source

Merge branch 'master' of http://47.100.37.243:10191/wutt/manHourHousekeeper

Guo1B0 1 year ago
parent
commit
879fedaf4b
14 changed files with 970 additions and 84 deletions
  1. 9 0
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/tasks/ImportModal.vue
  2. 141 0
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/tasks/TaskModal.vue
  3. 66 0
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/tasks/api.ts
  4. 205 43
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/tasks/index.vue
  5. 13 11
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/controller/ProductController.java
  6. 5 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/controller/SysFormController.java
  7. 17 3
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/Product.java
  8. 3 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/ProductService.java
  9. 2 0
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/SysFormService.java
  10. 254 4
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/ProductServiceImpl.java
  11. 233 1
      fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/SysFormServiceImpl.java
  12. 2 2
      fhKeeper/formulahousekeeper/management-crm/src/main/resources/mapper/ProductMapper.xml
  13. 19 19
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectServiceImpl.java
  14. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ProjectMapper.xml

+ 9 - 0
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/tasks/ImportModal.vue

@@ -0,0 +1,9 @@
+<template>
+<div>
+</div>
+</template>
+<script lang="ts" setup>
+
+</script>
+<style lang="scss" scoped>
+</style>

+ 141 - 0
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/tasks/TaskModal.vue

@@ -0,0 +1,141 @@
+<template>
+  <el-dialog v-model="modalVisible" width="30%" :show-close="false" :close-on-click-modal="false">
+    <template #header="{ titleId, titleClass }">
+      <div class="flex justify-between items-center border-b pb-3">
+        <h4 :id="titleId" :class="titleClass">{{ editForm ? '编辑任务' : '新增任务' }}</h4>
+        <div>
+          <el-button type="primary" @click="submitForm(false)">保存并新建</el-button>
+          <el-button type="primary" @click="submitForm(true)">保存</el-button>
+          <el-button @click="closeVisible()">取消</el-button>
+        </div>
+      </div>
+    </template>
+    <el-form ref="formRef" :model="form" label-width="100px" :rules="rules" class="flex flex-wrap form">
+      <el-form-item label="任务名称" prop="taskName" required>
+        <el-input v-model="form.taskName" type="textarea" placeholder="请输入任务名称" clearable maxlength="100"
+          show-word-limit />
+      </el-form-item>
+      <el-form-item prop="priority" label="优先级" required>
+        <el-select v-model="form.priority" placeholder="请选择" clearable>
+          <el-option v-for="item in PRIORITY " :key="item.value" :value="item.value" :label="item.label" />
+        </el-select>
+      </el-form-item>
+      <el-form-item prop="taskType" :label="form.taskType">
+        <template #label>
+          <el-select v-model="form.taskType" class="border resetSelect" style="width: 100px">
+            <el-option v-for="item in TASK_TYPE" :key="item.value" :value="item.value" :label="item.label" />
+          </el-select>
+        </template>
+        <el-select v-model="form.priority" placeholder="请选择" clearable filterable>
+          <el-option v-for="item in PRIORITY" :key="item.value" :value="item.value" :label="item.label" />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="联系人" v-if="TASK_TYPE.find(v => v.value === (form.taskType || '1'))?.show">
+        <el-select v-model="form.contact" placeholder="请选择" clearable filterable>
+          <el-option v-for="item in PRIORITY" :key="item.value" :value="item.value" :label="item.label" />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="执行人">
+        <el-select v-model="form.executeor" placeholder="请选择" clearable multiple filterable>
+          <el-option v-for="item in PRIORITY" :key="item.value" :value="item.value" :label="item.label" />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="重复提醒">
+        <el-switch v-model="form.repeat" active-value="1" inactive-value="0" />
+      </el-form-item>
+      <template v-if="form.repeat === '1'">
+        <el-form-item label="重复类型" label-width="7em" prop="startDate">
+          <el-select v-model="form.repeatType" placeholder="请选择">
+            <el-option v-for="item in REPEAT_TYPE" :key="item.value" :value="item.value" :label="item.label" />
+          </el-select>
+        </el-form-item>
+        <template v-if="['0', '1', '2'].includes(form.repeatType)">
+          <div>
+            {{ REPEAT_TYPE[form.repeatType].label }}
+          </div>
+        </template>
+        <template v-if="['3'].includes(form.repeatType)">
+          <div>
+            {{ '自定义周期' }}
+          </div>
+        </template>
+        <template v-if="['4'].includes(form.repeatType)">
+          <div>
+            {{ '自定义日期' }}
+          </div>
+        </template>
+      </template>
+      <el-form-item label="开始时间" label-width="7em" prop="startDate" class="w50">
+        <el-date-picker v-model="form.startDate" type="date" placeholder="选择日期" value-format="YYYY-MM-DD" />
+      </el-form-item>
+      <el-form-item label="截止时间" label-width="7em" prop="endDate" class="w50">
+        <el-date-picker v-model="form.endDate" type="date" placeholder="选择日期" value-format="YYYY-MM-DD" />
+      </el-form-item>
+    </el-form>
+    <el-form-item label="详细描述" prop="taskName">
+      <el-input v-model="form.taskName" type="textarea" placeholder="请输入任务名称" clearable maxlength="1000" show-word-limit
+        :autosize="{ minRows: 4 }" />
+    </el-form-item>
+  </el-dialog>
+</template>
+
+<script lang="ts" setup>
+import { ref, watch } from 'vue';
+import { PRIORITY, TASK_TYPE, modalForm, REPEAT_TYPE } from "./api"
+const props = defineProps({
+  visible: {
+    type: Boolean,
+    default: false
+  },
+  editForm: {
+    type: Object,
+  }
+})
+const emit = defineEmits(['closeModalVisible', 'submitForm'])
+const modalVisible = ref(false)
+const form = ref<any>({})
+const rules = ref({
+  taskName: [
+    { required: true, message: '请输入任务名称', trigger: 'blur' }
+  ],
+  priority: [
+    { required: true, message: '请选择优先级', trigger: 'blur' }
+  ]
+})
+function closeVisible() {
+  emit('closeModalVisible')
+}
+function submitForm(isClose: boolean) {
+  console.log("form", form.value, isClose);
+  // emit('submitForm', { form: form.value, isClose })
+}
+watch(props, (val) => {
+  modalVisible.value = val.visible
+  form.value = val.editForm ? { ...val.editForm } : modalForm
+})
+</script>
+
+<style lang="scss">
+.resetSelect {
+  border: 0;
+
+  .el-select__wrapper {
+    box-shadow: none;
+    padding-right: 0;
+  }
+
+  .el-select__selected-item {
+    text-align: right;
+  }
+}
+
+.el-form-item {
+  width: 100%;
+}
+
+.form {
+  .w50 {
+    @apply w-1/2;
+  }
+}
+</style>

+ 66 - 0
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/tasks/api.ts

@@ -1 +1,67 @@
+import { EpPropMergeType } from "element-plus/es/utils";
+
 export const MDO = "/tasks";
+type StatusType = {
+  label: "全部" | "未开始" | "进行中" | "已完成" | "已超时";
+  value: string;
+  type: EpPropMergeType<
+    StringConstructor,
+    "" | "info" | "primary" | "success" | "danger" | "warning",
+    unknown
+  >;
+};
+export const defaultSearchForm = {
+  //默认搜索条件
+  taskName: "",
+  customerName: "",
+  tel: "",
+  priority: "",
+  status: "",
+  startDate: "",
+  endDate: "",
+  page: 1,
+  pageSize: 10,
+};
+export const modalForm = {
+  taskName: "", //任务名称
+  priority: "", //优先级
+  taskType: "1", //  任务类型
+  customerId: "0", //  客户id 0
+  businessId: "1", //商机id 1
+  orderId: "2", //  订单id 2
+  clueid: "3", //线索id 3
+  contactsId: "", //联系人id
+  executorId: "", //执行人id
+  repeat: "0", //是否重复
+  repeatType: "0", //重复类型
+  startDate: "", //开始日期
+  endDate: "", //截止日期
+  taskDesc: "", //任务描述
+};
+export const PRIORITY = [
+  //优先级
+  { label: "高", value: "0" },
+  { label: "中", value: "1" },
+  { label: "低", value: "2" },
+];
+export const STATUS: StatusType[] = [
+  //任务状态
+  { label: "未开始", value: "0", type: "info" },
+  { label: "进行中", value: "1", type: "primary" },
+  { label: "已完成", value: "2", type: "success" },
+  { label: "已超时", value: "3", type: "danger" },
+];
+export const TASK_TYPE = [
+  // 弹窗任务类型
+  { label: "客户", value: "0", show: true },
+  { label: "商机", value: "1", show: true },
+  { label: "销售订单", value: "2", show: true },
+  { label: "线索", value: "3", show: false },
+];
+export const REPEAT_TYPE = [
+  { label: "每天", value: "0" },
+  { label: "每周", value: "1" },
+  { label: "每月", value: "2" },
+  { label: "自定义周期", value: "3" },
+  { label: "自定义日期", value: "4" },
+];

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

@@ -3,40 +3,46 @@
     <div class="p-5 w-80 pr-0">
       <div class="bg-white w-full h-full shadow-md rounded-md flex flex-col">
         <div class="flex-1 p-3 overflow-y-auto">
-          <el-form :model="ruleForm">
+          <el-form :model="searchForm">
             <el-form-item label="任务名称:" label-width="7em" prop="taskName">
-              <el-input v-model="ruleForm.taskName" placeholder="请输入" />
+              <el-input v-model="searchForm.taskName" placeholder="请输入" />
+            </el-form-item>
+            <el-form-item label="优先级:" label-width="7em" prop="priority">
+              <el-select v-model="searchForm.priority" placeholder="请选择">
+                <el-option v-for="item in PRIORITY" :key="item.value" :value="item.value" :label="item.label" />
+              </el-select>
             </el-form-item>
             <el-form-item label="客户名称:" label-width="7em" prop="customerName">
-              <el-input v-model="ruleForm.customerName" placeholder="请输入" />
+              <el-input v-model="searchForm.customerName" placeholder="请输入" />
             </el-form-item>
-            <el-form-item label="联系人电话:" label-width="7em" prop="tel">
-              <el-input v-model="ruleForm.tel" placeholder="请输入" />
+            <el-form-item label="联系人:" label-width="7em" prop="tel">
+              <el-input v-model="searchForm.tel" placeholder="请输入" />
             </el-form-item>
-            <el-form-item label="优先级" label-width="7em" prop="priority">
-              <el-select v-model="ruleForm.priority" placeholder="请选择">
-                <el-option label="全部" value="0" />
-                <el-option label="高" value="1" />
-                <el-option label="中" value="2" />
-                <el-option label="低" value="3" />
+            <el-form-item label="执行人:" label-width="7em" prop="tel">
+              <el-select v-model="searchForm.status" placeholder="请选择">
+                <el-option v-for="item in STATUS" :key="item.value" :value="item.value" :label="item.label" />
               </el-select>
             </el-form-item>
-            <el-form-item label="任务状态" label-width="7em" prop="status">
-              <el-select v-model="ruleForm.status" placeholder="请选择">
-                <el-option label="全部" value="0" />
-                <el-option label="未开始" value="1" />
-                <el-option label="进行中" value="2" />
-                <el-option label="已完成" value="3" />
-                <el-option label="超时" value="4" />
+            <el-form-item label="商机名称:" label-width="7em" prop="tel">
+              <el-input v-model="searchForm.tel" placeholder="请输入" />
+            </el-form-item>
+            <el-form-item label="销售订单:" label-width="7em" prop="tel">
+              <el-input v-model="searchForm.tel" placeholder="请输入" />
+            </el-form-item>
+            <el-form-item label="线索名称:" label-width="7em" prop="tel">
+              <el-input v-model="searchForm.tel" placeholder="请输入" />
+            </el-form-item>
+            <el-form-item label="任务状态:" label-width="7em" prop="status">
+              <el-select v-model="searchForm.status" placeholder="请选择">
+                <el-option v-for="item in STATUS" :key="item.value" :value="item.value" :label="item.label" />
               </el-select>
             </el-form-item>
-            <el-form-item label="开始日期" label-width="7em" prop="startDate">
-              <el-date-picker v-model="ruleForm.startDate" type="date" placeholder="选择日期" value-format="YYYY-MM-DD" />
+            <el-form-item label="开始时间:" label-width="7em" prop="startDate">
+              <el-date-picker v-model="searchForm.startDate" type="date" placeholder="选择日期" value-format="YYYY-MM-DD" />
             </el-form-item>
-            <el-form-item label="结束日期" label-width="7em" prop="endDate">
-              <el-date-picker v-model="ruleForm.endDate" type="date" placeholder="选择日期" value-format="YYYY-MM-DD" />
+            <el-form-item label="截止时间:" label-width="7em" prop="endDate">
+              <el-date-picker v-model="searchForm.endDate" type="date" placeholder="选择日期" value-format="YYYY-MM-DD" />
             </el-form-item>
-
           </el-form>
         </div>
         <div class="w-full flex p-3 shadow-[0_-3px_5px_0px_rgba(0,0,0,0.2)]">
@@ -45,37 +51,193 @@
         </div>
       </div>
     </div>
-    <div class="flex-1 p-5">
-      <div class="bg-white w-full h-full p-3 shadow-md rounded-md">222</div>
+    <div class="flex-1 p-5 overflow-auto">
+      <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" @click="createTasks()">创建任务</el-Button>
+          <el-button type="primary" @click="deleteTasks()">批量删除</el-Button>
+          <el-button type="primary" @click="importTasks()">导入</el-Button>
+          <el-button type="primary" @click="exportTasks()">导出</el-Button>
+        </div>
+        <div class="flex-1">
+          <el-table :data="tableData" style="width: 100%;height: 100%;">
+            <el-table-column prop="taskName" label="任务名称" header-align="center" align="center" show-overflow-tooltip
+              width="200" />
+            <el-table-column prop="priority" label="优先级" width="90" :sortable="true" header-align="center"
+              align="center">
+              <template #default="scope">
+                {{ PRIORITY[scope.row.priority]?.label }}
+              </template>
+            </el-table-column>
+            <el-table-column prop="status" label="状态" width="100" header-align="center" align="center">
+
+              <template #default="scope">
+                <el-text :type="STATUS[scope.row.status]?.type">
+                  {{ STATUS[scope.row.status]?.label }}
+                </el-text>
+              </template>
+            </el-table-column>
+            <el-table-column prop="customerName" label="执行人" width="120" header-align="center" align="center" />
+            <el-table-column prop="startDate" label="开始时间" width="120" :sortable="true" header-align="center"
+              align="center" />
+            <el-table-column prop="endDate" label="截止时间" width="120" :sortable="true" header-align="center"
+              align="center" />
+            <el-table-column prop="contactsName" label="联系人" header-align="center" align="center" width="120" />
+            <el-table-column prop="contactsTel" label="联系人号码" header-align="center" align="center" width="140" />
+            <el-table-column prop="customerName" label="客户名称" header-align="center" align="center" width="120" />
+            <el-table-column prop="businessName" label="商机名称" header-align="center" align="center" width="200" />
+            <el-table-column prop="businessName" label="销售订单" header-align="center" align="center" width="200" />
+            <el-table-column prop="businessName" label="线索名称" header-align="center" align="center" width="200" />
+            <el-table-column fixed="right" label="操作" header-align="center" align="center" width="150">
+
+              <template #default="scope">
+                <el-button link type="primary" size="small" @click.prevent="editRow(scope.row)">
+                  编辑
+                </el-button>
+                <el-button link type="primary" size="small" v-if="scope.row.status == '3'"
+                  @click.prevent="restart(scope.$index)">
+                  重启
+                </el-button>
+                <el-button link type="primary" size="small" v-else @click.prevent="finishRow(scope.$index, scope)">
+                  完成
+                </el-button>
+
+                <el-button link type="danger" size="small" @click.prevent="deleteRow(scope.$index)">
+                  删除
+                </el-button>
+              </template>
+            </el-table-column>
+          </el-table>
+        </div>
+        <div class="ml-auto">
+          <el-pagination layout="total, prev, pager, next, sizes" :total="20" hide-on-single-page />
+        </div>
+      </div>
     </div>
+    <TaskModal :visible="taskModalVisible" :edit-form="taskForm" @close-modal-visible="closeModal()" />
   </div>
 </template>
 
 <script lang="ts" setup>
-import { onBeforeMount, onMounted, ref } from 'vue';
+import { onBeforeMount, ref } from 'vue';
 import { useStore } from '@/store';
-import { MDO } from './api';
+import { MDO, PRIORITY, STATUS, defaultSearchForm } from './api';
+import { dayjs } from 'element-plus';
+import TaskModal from './TaskModal.vue';
 const { getFunctionList } = useStore()
-const config = ref<any>([])
-const defaultForm = {
-  taskName: '',
-  customerName: '',
-  tel: '',
-  priority: '0',
-  status: '0',
-  startDate: '',
-  endDate: '',
+
+const pagePermission = ref<any[]>();
+const taskModalVisible = ref(false);
+const taskForm = ref<any>();
+function closeModal() {
+  taskModalVisible.value = false;
+  taskForm.value = null;
+}
+
+const searchForm = ref<any>();
+const tableData = ref<any[]>([
+  {
+    taskName: '任务1111111111111111111111111',
+    contactsTel: "15100111111",
+    contactsName: "水水水水",
+    customerName: '李四',
+    status: '0',
+    priority: '0',
+    startDate: dayjs().format('YYYY-MM-DD'),
+    endDate: dayjs().format('YYYY-MM-DD'),
+    taskType: '1'
+  },
+  {
+    taskName: '任务222',
+    customerName: '张三',
+    status: '1',
+    priority: '1',
+    startDate: dayjs().format('YYYY-MM-DD'),
+    endDate: dayjs().format('YYYY-MM-DD'),
+    taskType: '2'
+  },
+  {
+    taskName: '任务333',
+    customerName: '王五',
+    status: '2',
+    priority: '2',
+    startDate: dayjs().format('YYYY-MM-DD'),
+    endDate: dayjs().format('YYYY-MM-DD'),
+    taskType: '0'
+  },
+  {
+    taskName: '任务444',
+    customerName: '赵六',
+    status: '3',
+    priority: '1',
+    startDate: dayjs().format('YYYY-MM-DD'),
+    endDate: dayjs().format('YYYY-MM-DD'),
+    taskType: '3'
+  },
+  {
+    taskName: '任务555',
+    customerName: '马六',
+    status: '1',
+    priority: '2',
+    startDate: dayjs().format('YYYY-MM-DD'),
+    endDate: dayjs().format('YYYY-MM-DD'),
+  },
+  {
+    taskName: '任务666',
+    customerName: '吴七',
+    status: '3',
+    priority: '0',
+    startDate: dayjs().format('YYYY-MM-DD'),
+    endDate: dayjs().format('YYYY-MM-DD'),
+  },
+  {
+    taskName: '任务777',
+    customerName: '钱八',
+    status: '0',
+    priority: '1',
+    startDate: dayjs().format('YYYY-MM-DD'),
+    endDate: dayjs().format('YYYY-MM-DD'),
+  }
+])
+function search() {
+  console.log("searchForm", searchForm.value);
+}
+function reset() {
+  searchForm.value = defaultSearchForm;
+}
+function createTasks() {
+  taskModalVisible.value = true;
+  taskForm.value = null;
+}
+function deleteTasks() {
+  console.log("deleteTasks", searchForm.value);
+  console.log(dayjs().format('YYYY-MM-DD'));
+}
+
+function importTasks() {
+  console.log("importTasks", searchForm.value);
+}
+
+function exportTasks() {
+  console.log("exportTasks", searchForm.value);
+}
+
+function editRow(row: any) {
+  taskModalVisible.value = true;
+  taskForm.value = row;
+}
+function finishRow(index: any, scope: any) {
+  console.log("finishRow", index, scope);
 }
-const ruleForm = ref<any>()
-const reset = () => {
-  ruleForm.value = defaultForm;
+function restart(index: any) {
+  console.log("restart", index);
 }
-const search = () => {
-  console.log("ruleForm", ruleForm.value);
+function deleteRow(index: any) {
+  console.log("deleteRow", index);
 }
 onBeforeMount(() => {
-  config.value = getFunctionList(MDO);
-  ruleForm.value = defaultForm;
+  pagePermission.value = getFunctionList(MDO);
+  searchForm.value = defaultSearchForm;
 })
 </script>
 

+ 13 - 11
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/controller/ProductController.java

@@ -2,12 +2,16 @@ package com.management.platform.controller;
 
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.management.platform.entity.Product;
-import com.management.platform.entity.Task;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.management.platform.entity.*;
 import com.management.platform.mapper.UserMapper;
 import com.management.platform.service.ProductService;
 import com.management.platform.service.TaskService;
 import com.management.platform.util.HttpRespMsg;
+import com.management.platform.util.MessageUtils;
+import org.apache.poi.hssf.usermodel.*;
+import org.apache.poi.ss.usermodel.*;
+import org.apache.poi.ss.util.CellRangeAddressList;
 import org.springframework.web.bind.annotation.RequestMapping;
 
 import org.springframework.web.bind.annotation.RestController;
@@ -15,6 +19,11 @@ import org.springframework.web.multipart.MultipartFile;
 
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
 
 /**
  * <p>
@@ -80,16 +89,9 @@ public class ProductController {
         return msg;
     }
 
-    @RequestMapping("/getTemplate")
-    public HttpRespMsg getTemplate(Integer id){
-        HttpRespMsg msg=new HttpRespMsg();
-        return msg;
-    }
-
     @RequestMapping("/importData")
-    public HttpRespMsg importData(MultipartFile file){
-        HttpRespMsg msg=new HttpRespMsg();
-        return msg;
+    public HttpRespMsg importData(MultipartFile multipartFile){
+        return productService.importData(multipartFile);
     }
 
 }

+ 5 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/controller/SysFormController.java

@@ -82,5 +82,10 @@ public class SysFormController {
         }
         return msg;
     }
+
+    @RequestMapping("/getExportTemplate")
+    public HttpRespMsg getExportTemplate(String code){
+        return sysFormService.getExportTemplate(code);
+    }
 }
 

+ 17 - 3
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/entity/Product.java

@@ -7,9 +7,12 @@ import com.baomidou.mybatisplus.annotation.TableId;
 import java.time.LocalDateTime;
 import com.baomidou.mybatisplus.annotation.TableField;
 import java.io.Serializable;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.experimental.Accessors;
+import org.springframework.format.annotation.DateTimeFormat;
 
 /**
  * <p>
@@ -17,7 +20,7 @@ import lombok.experimental.Accessors;
  * </p>
  *
  * @author Seyason
- * @since 2024-02-28
+ * @since 2024-03-08
  */
 @Data
 @EqualsAndHashCode(callSuper = false)
@@ -78,6 +81,8 @@ public class Product extends Model<Product> {
      * 创建时间
      */
     @TableField("create_time")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
     private LocalDateTime createTime;
 
     /**
@@ -119,8 +124,17 @@ public class Product extends Model<Product> {
     /**
      * 描述
      */
-    @TableField("desc")
-    private String desc;
+    @TableField("descs")
+    private String descs;
+
+    @TableField(exist = false)
+    private String inchargerName;
+
+    @TableField(exist = false)
+    private String typeName;
+
+    @TableField(exist = false)
+    private String unitName;
 
 
     @Override

+ 3 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/ProductService.java

@@ -3,6 +3,7 @@ package com.management.platform.service;
 import com.management.platform.entity.Product;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.management.platform.util.HttpRespMsg;
+import org.springframework.web.multipart.MultipartFile;
 
 /**
  * <p>
@@ -15,4 +16,6 @@ import com.management.platform.util.HttpRespMsg;
 public interface ProductService extends IService<Product> {
 
     HttpRespMsg getList(Integer companyId,String userId, String productName, String productCode, Integer pageIndex, Integer pageSize);
+
+    HttpRespMsg importData(MultipartFile multipartFile);
 }

+ 2 - 0
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/SysFormService.java

@@ -2,6 +2,7 @@ package com.management.platform.service;
 
 import com.management.platform.entity.SysForm;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.management.platform.util.HttpRespMsg;
 
 /**
  * <p>
@@ -13,4 +14,5 @@ import com.baomidou.mybatisplus.extension.service.IService;
  */
 public interface SysFormService extends IService<SysForm> {
 
+    HttpRespMsg getExportTemplate(String code);
 }

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

@@ -1,19 +1,37 @@
 package com.management.platform.service.impl;
 
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.management.platform.entity.Product;
+import com.management.platform.entity.*;
 import com.management.platform.mapper.ProductMapper;
+import com.management.platform.mapper.SysDictMapper;
+import com.management.platform.mapper.SysFormMapper;
+import com.management.platform.mapper.UserMapper;
 import com.management.platform.service.ProductService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.management.platform.service.WxCorpInfoService;
+import com.management.platform.util.ExcelUtil;
 import com.management.platform.util.HttpRespMsg;
+import org.apache.poi.hssf.usermodel.HSSFCell;
+import org.apache.poi.hssf.usermodel.HSSFRow;
+import org.apache.poi.hssf.usermodel.HSSFSheet;
+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.util.StringUtils;
+import org.springframework.web.multipart.MultipartFile;
 
 import javax.annotation.Resource;
-import java.util.HashMap;
-import java.util.Map;
+import javax.servlet.http.HttpServletRequest;
+import java.io.*;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.*;
 
 /**
  * <p>
@@ -28,12 +46,27 @@ public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> impl
 
     @Resource
     private ProductMapper productMapper;
+    @Resource
+    private HttpServletRequest request;
+    @Resource
+    private UserMapper userMapper;
+    @Resource
+    private SysFormMapper sysFormMapper;
+    @Value(value = "${upload.path}")
+    private String path;
+    @Resource
+    private WxCorpInfoService wxCorpInfoService;
+    @Resource
+    private SysDictMapper sysDictMapper;
 
     @Override
     public HttpRespMsg getList(Integer companyId,String userId, String productName, String productCode, Integer pageIndex, Integer pageSize) {
         HttpRespMsg msg=new HttpRespMsg();
         LambdaQueryWrapper<Product> queryWrapper = new LambdaQueryWrapper<>();
         queryWrapper.eq(Product::getCompanyId,companyId);
+        List<User> userList = userMapper.selectList(new LambdaQueryWrapper<User>().eq(User::getCompanyId, companyId));
+        List<SysDict> sysDictOfProductType = sysDictMapper.selectList(new LambdaQueryWrapper<SysDict>().eq(SysDict::getCompanyId, companyId).eq(SysDict::getCode, "ProductType"));
+        List<SysDict> sysDictOfProductUnit = sysDictMapper.selectList(new LambdaQueryWrapper<SysDict>().eq(SysDict::getCompanyId, companyId).eq(SysDict::getCode, "ProductUnit"));
         if(!StringUtils.isEmpty(userId)){
             queryWrapper.eq(Product::getCreatorId,userId);
         }
@@ -44,10 +77,227 @@ public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> impl
             queryWrapper.like(Product::getProductCode,productCode);
         }
         IPage<Product> productIPage = productMapper.selectPage(new Page<>(pageIndex, pageSize), queryWrapper);
+        List<Product> records = productIPage.getRecords();
+        records.forEach(r->{
+            Optional<User> user = userList.stream().filter(u -> u.getId().equals(r.getCreatorId())).findFirst();
+            if(user.isPresent()){
+                r.setInchargerName(user.get().getName());
+            }
+            Optional<SysDict> unit = sysDictOfProductUnit.stream().filter(u -> u.getId().equals(r.getUnit())).findFirst();
+            if(unit.isPresent()){
+                r.setUnitName(unit.get().getName());
+            }
+            Optional<SysDict> type = sysDictOfProductType.stream().filter(u -> u.getId().equals(r.getCreatorId())).findFirst();
+            if(type.isPresent()){
+                r.setTypeName(type.get().getName());
+            }
+        });
         Map map=new HashMap();
-        map.put("record",productIPage.getRecords());
+        map.put("record",records);
         map.put("total",productIPage.getTotal());
         msg.setData(map);
         return msg;
     }
+
+    @Override
+    public HttpRespMsg importData(MultipartFile multipartFile) {
+        HttpRespMsg msg=new HttpRespMsg();
+        String fileName = multipartFile.getOriginalFilename();
+        File file = new File(fileName == null ? "file" : fileName);
+        User user = userMapper.selectById(request.getHeader("token"));
+        Integer companyId = user.getCompanyId();
+        WxCorpInfo wxCorpInfo = wxCorpInfoService.getOne(new LambdaQueryWrapper<WxCorpInfo>().eq(WxCorpInfo::getCompanyId, companyId));
+        List<Product> productList = productMapper.selectList(new LambdaQueryWrapper<Product>().eq(Product::getCompanyId, companyId));
+        List<User> userList = userMapper.selectList(new LambdaQueryWrapper<User>().eq(User::getCompanyId, companyId));
+        List<SysDict> sysDictOfProductType = sysDictMapper.selectList(new LambdaQueryWrapper<SysDict>().eq(SysDict::getCompanyId, companyId).eq(SysDict::getCode, "ProductType"));
+        List<SysDict> sysDictOfProductUnit = sysDictMapper.selectList(new LambdaQueryWrapper<SysDict>().eq(SysDict::getCompanyId, companyId).eq(SysDict::getCode, "ProductUnit"));
+        InputStream inputStream = null;
+        OutputStream outputStream = null;
+        try {
+            inputStream = multipartFile.getInputStream();
+            outputStream = new FileOutputStream(file);
+            byte[] buffer = new byte[4096];
+            int temp = 0;
+            while ((temp = inputStream.read(buffer, 0, 4096)) != -1) {
+                outputStream.write(buffer, 0, temp);
+            }
+            inputStream.close();
+            outputStream.close();
+            //解析表格
+            HSSFWorkbook workbook = new HSSFWorkbook(new FileInputStream(file));
+            //我们只需要第一个sheet
+            HSSFSheet sheet = workbook.getSheetAt(0);
+            //由于第一行需要指明列对应的标题
+            int rowNum = sheet.getLastRowNum();
+            //获取当前表单模板 校验规则
+            SysForm sysForm = sysFormMapper.selectOne(new LambdaQueryWrapper<SysForm>().eq(SysForm::getCode, "Product").eq(SysForm::getCompanyId, companyId).eq(SysForm::getIsCurrent, 1));
+            if(sysForm==null){
+                msg.setError("当前模块未配置自定义模板,需先完成配置");
+                return msg;
+            }
+            String config = sysForm.getConfig();
+            JSONObject configOb = JSON.parseObject(config);
+            JSONArray configObJSONArray = configOb.getJSONArray("list");
+            List<Product>  importProductList=new ArrayList<>();
+            List<String> userNameList=new ArrayList<>();
+            HttpRespMsg respMsg=new HttpRespMsg();
+            for (int rowIndex = 0; rowIndex <= rowNum; rowIndex++) {
+                HSSFRow row = sheet.getRow(rowIndex);
+                if (row == null) {
+                    continue;
+                }
+                //跳过空行
+                if (ExcelUtil.isRowEmpty(row)) {
+                    continue;
+                }
+                //获取到当前行的列数据
+                int cellNum = row.getLastCellNum();
+                for (int i = 0; i < cellNum; i++) {
+                    JSONObject item = configObJSONArray.getJSONObject(i);
+                    String modelName = item.getString("model");
+                    HSSFCell cell = row.getCell(i);
+                    if(cell!=null){
+                        switch (item.getString("type")){
+                            case "time":cell.setCellType(CellType.NUMERIC);
+                                break;
+                            default:cell.setCellType(CellType.STRING);
+                        }
+                    }
+                    if(modelName.equals("inchargerId")){
+                        if(!StringUtils.isEmpty(cell.getStringCellValue())){
+                            userNameList.add(cell.getStringCellValue());
+                        }
+                    }
+
+                }
+            }
+            System.out.println("参与搜素的人员列表"+userNameList + userNameList.size());
+            if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1&&userNameList.size()>0){
+                respMsg = wxCorpInfoService.getBatchSearchUserInfo(wxCorpInfo, userNameList,null);
+                if(respMsg.code.equals("0")){
+                    msg.setError("姓名为["+String.valueOf(respMsg.data)+"]的人员存在重复,请使用工号!");
+                    return msg;
+                }
+            }
+            List<User> targetUserList= (List<User>) respMsg.data;
+            for (int rowIndex = 0; rowIndex <= rowNum; rowIndex++) {
+                HSSFRow row = sheet.getRow(rowIndex);
+                if (row == null) {
+                    continue;
+                }
+                //跳过空行
+                if (ExcelUtil.isRowEmpty(row)) {
+                    continue;
+                }
+                //获取到当前行的列数据
+                int cellNum = row.getLastCellNum();
+                Product product=new Product();
+                product.setCompanyId(companyId);
+                product.setCreatorId(user.getId());
+                for (int i = 0; i < cellNum; i++) {
+                    JSONObject item = configObJSONArray.getJSONObject(i);
+                    String modelName = item.getString("model");
+                    String className = modelName.substring(0, 1).toUpperCase() + modelName.substring(1);
+                    String getter="get"+className;
+                    String setter="set"+className;
+                    HSSFCell cell = row.getCell(i);
+                    if(cell!=null){
+                        switch (item.getString("type")){
+                            case "time":cell.setCellType(CellType.NUMERIC);
+                                break;
+                            default:cell.setCellType(CellType.STRING);
+                        }
+                    }
+//                    Class<?> productClass = Class.forName("com.management.platform.entity.Product");
+                    Class<Product> productClass = Product.class;
+                    Method method = productClass.getMethod(setter, String.class);
+                    //校验当前列是否为必填
+                    JSONObject options = item.getJSONObject("options");
+                    JSONObject rules = options.getJSONObject("rules");
+                    Boolean required = rules.getBoolean("required");
+                    if(required){
+                        if(StringUtils.isEmpty(cell.getStringCellValue())){
+                            msg.setError(item.getString("label")+"值不能为空值");
+                            return msg;
+                        }
+                    }
+                    if(modelName.equals("productCode")){
+                        if(!StringUtils.isEmpty(cell.getStringCellValue())){
+                            //系统中同公司已存在的产品编码 更新
+                            Optional<Product> first = productList.stream().filter(p ->p.getProductCode()!=null&& p.getProductCode().equals(cell.getStringCellValue())).findFirst();
+                            if(first.isPresent()){
+                                product.setId(first.get().getId());
+                            }
+                        }
+                    }
+                    if(modelName.equals("inchargerId")){
+                        if(!StringUtils.isEmpty(cell.getStringCellValue())){
+                            String userName = cell.getStringCellValue();
+                            Optional<User> first;
+                            if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                                Optional<User> optional = targetUserList.stream().filter(tl -> tl.getName().equals(userName)).findFirst();
+                                first= userList.stream().filter(u ->(u.getJobNumber()!=null&&u.getJobNumber().equals(userName))||(optional.isPresent()&&u.getCorpwxUserid()!=null&&u.getCorpwxUserid().equals(optional.get().getCorpwxUserid()))).findFirst();
+                            }else {
+                                first= userList.stream().filter(u -> u.getName().equals(userName)||(u.getJobNumber()!=null&&u.getJobNumber().equals(userName))).findFirst();
+                            }
+                            if (first.isPresent()) {
+                                product.setInchargerId(first.get().getId());
+                            } else {
+                                throw new Exception("["+userName+"]在系统中不存在");
+                            }
+                        }
+                    }
+                    if(modelName.equals("status")){
+                        if(!StringUtils.isEmpty(cell.getStringCellValue())){
+                            switch (cell.getStringCellValue()){
+                                case "下架":product.setStatus(0);
+                                break;
+                                case "上架":product.setStatus(1);
+                                break;
+                            }
+                        }
+                    }
+                    if(modelName.equals("type")){
+                        if(!StringUtils.isEmpty(cell.getStringCellValue())){
+                            Optional<SysDict> first = sysDictOfProductType.stream().filter(s -> s.getName().equals(cell.getStringCellValue())).findFirst();
+                            if(first.isPresent()){
+                                product.setType(first.get().getId());
+                            }else {
+                                throw new Exception("产品类型["+cell.getStringCellValue()+"不存在,请在系统字典中增加");
+                            }
+                        }
+                    }
+                    if(modelName.equals("unit")){
+                        if(!StringUtils.isEmpty(cell.getStringCellValue())){
+                            Optional<SysDict> first = sysDictOfProductUnit.stream().filter(s -> s.getName().equals(cell.getStringCellValue())).findFirst();
+                            if(first.isPresent()){
+                                product.setUnit(first.get().getId());
+                            }else {
+                                throw new Exception("产品单位["+cell.getStringCellValue()+"不存在,请在系统字典中增加");
+                            }
+                        }
+                    }
+                    if(!StringUtils.isEmpty(cell.getStringCellValue())){
+                        method.invoke(product,cell.getStringCellValue());
+                    }
+                }
+                importProductList.add(product);
+            }
+            if(importProductList.size()>0){
+               if(!saveOrUpdateBatch(importProductList)){
+                   msg.setError("验证失败");
+                   return msg;
+               }
+            }
+        } catch (IOException | NoSuchMethodException e) {
+            e.printStackTrace();
+        } catch (IllegalAccessException e) {
+            e.printStackTrace();
+        } catch (InvocationTargetException e) {
+            e.printStackTrace();
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return msg;
+    }
 }

+ 233 - 1
fhKeeper/formulahousekeeper/management-crm/src/main/java/com/management/platform/service/impl/SysFormServiceImpl.java

@@ -1,11 +1,32 @@
 package com.management.platform.service.impl;
 
-import com.management.platform.entity.SysForm;
+import com.alibaba.fastjson.JSON;
+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.*;
+import com.management.platform.mapper.CompanyMapper;
 import com.management.platform.mapper.SysFormMapper;
+import com.management.platform.mapper.UserMapper;
 import com.management.platform.service.SysFormService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.management.platform.util.HttpRespMsg;
+import com.management.platform.util.MessageUtils;
+import org.apache.poi.hssf.usermodel.*;
+import org.apache.poi.ss.usermodel.*;
+import org.apache.poi.ss.util.CellRangeAddressList;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+
 /**
  * <p>
  *  服务实现类
@@ -17,4 +38,215 @@ import org.springframework.stereotype.Service;
 @Service
 public class SysFormServiceImpl extends ServiceImpl<SysFormMapper, SysForm> implements SysFormService {
 
+    @Resource
+    private CompanyMapper companyMapper;
+    @Resource
+    private HttpServletRequest request;
+    @Resource
+    private UserMapper userMapper;
+    @Resource
+    private SysFormMapper sysFormMapper;
+    @Value(value = "${upload.path}")
+    private String path;
+
+    @Override
+    public HttpRespMsg getExportTemplate(String code) {
+        HttpRespMsg msg=new HttpRespMsg();
+        List<String> heads = new ArrayList<>();
+        Integer companyId = userMapper.selectById(request.getHeader("token")).getCompanyId();
+        Company company = companyMapper.selectById(companyId);
+        //根据code获取当前公司配置的表单模板
+        SysForm sysForm = sysFormMapper.selectOne(new LambdaQueryWrapper<SysForm>().eq(SysForm::getCompanyId, companyId).eq(SysForm::getCode, code).eq(SysForm::getIsCurrent, 1));
+        if(sysForm==null){
+            msg.setError("当前表单未配置模板,请先完成模板配置");
+            return msg;
+        }
+        String config = sysForm.getConfig();
+        JSONObject configOb = JSON.parseObject(config);
+        JSONArray configObJSONArray = configOb.getJSONArray("list");
+        for (int i = 0; i < configObJSONArray.size(); i++) {
+            JSONObject item = configObJSONArray.getJSONObject(i);
+            heads.add(item.getString("label"));
+        }
+        List<List<String>> allList = new ArrayList<>();
+        allList.add(heads);
+        String title;
+        switch (code){
+            case "Clue":title = company.getCompanyName()+"_线索导入模板";
+            break;
+            case "Custom":title = company.getCompanyName()+"_客户导入模板";
+                break;
+            case "Order":title = company.getCompanyName()+"_订单导入模板";
+                break;
+            case "Product":title = company.getCompanyName()+"_产品导入模板";
+                break;
+            case "Task":title = company.getCompanyName()+"_任务导入模板";
+                break;
+            case "Contacts":title = company.getCompanyName()+"_联系人导入模板";
+                break;
+            case "Business":title = company.getCompanyName()+"_商机导入模板";
+                break;
+            default:title="";
+        }
+        String result=MessageUtils.message("file.excelScu");
+        String fileName= title+".xls";
+        try {
+//            response.reset();
+//            response.setHeader("Content-disposition",
+//                "attachment;filename="+ URLEncoder.encode(fileName, "UTF-8"));
+//            //设置文件头编码格式
+//            response.setContentType("APPLICATION/OCTET-STREAM;charset=UTF-8");//设置类型
+//            response.setHeader("Cache-Control","no-cache");//设置头
+//            response.setDateHeader("Expires", 0);//设置日期头
+            // 创建工作簿
+            HSSFWorkbook workBook = new HSSFWorkbook();
+            // 创建工作类
+            HSSFSheet sheet = workBook.createSheet();
+            //设置首行冻结
+            sheet.createFreezePane(0, 1);
+            sheet.setDefaultColumnWidth(16);
+            //设置字体样式
+            HSSFFont headFont = workBook.createFont();
+            headFont.setBold(true);
+            headFont.setFontHeightInPoints((short) 10);
+            headFont.setFontName("黑体");
+
+            HSSFFont titleFont = workBook.createFont();
+            titleFont.setBold(true);
+            titleFont.setFontHeightInPoints((short) 10);
+            titleFont.setFontName("黑体");
+
+            HSSFFont font = workBook.createFont();
+            font.setFontHeightInPoints((short) 10);
+            font.setFontName("宋体");
+
+            //设置单元格样式
+            CellStyle headStyle = workBook.createCellStyle();
+            headStyle.setFont(headFont);
+            headStyle.setAlignment(HorizontalAlignment.CENTER);
+            headStyle.setVerticalAlignment(org.apache.poi.ss.usermodel.VerticalAlignment.CENTER);
+            headStyle.setWrapText(true);
+            headStyle.setBorderBottom(BorderStyle.THIN); //下边框
+            headStyle.setBorderLeft(BorderStyle.THIN);//左边框
+            headStyle.setBorderTop(BorderStyle.THIN);//上边框
+            headStyle.setBorderRight(BorderStyle.THIN);//右边框
+
+            String color = "c0c0c0";    //此处得到的color为16进制的字符串
+            //转为RGB码
+            int r = Integer.parseInt((color.substring(0,2)),16);   //转为16进制
+            int g = Integer.parseInt((color.substring(2,4)),16);
+            int b = Integer.parseInt((color.substring(4,6)),16);
+
+            //自定义cell颜色
+            HSSFPalette palette = workBook.getCustomPalette();
+            //这里的9是索引
+            palette.setColorAtIndex((short)9, (byte) r, (byte) g, (byte) b);
+
+            CellStyle titleStyle = workBook.createCellStyle();
+            titleStyle.setFont(titleFont);
+            titleStyle.setAlignment(HorizontalAlignment.CENTER);
+            titleStyle.setVerticalAlignment(org.apache.poi.ss.usermodel.VerticalAlignment.CENTER);
+            titleStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);  //填充单元格
+            titleStyle.setFillForegroundColor((short)9);    //填色
+            titleStyle.setWrapText(true);
+            titleStyle.setBorderBottom(BorderStyle.THIN); //下边框
+            titleStyle.setBorderLeft(BorderStyle.THIN);//左边框
+            titleStyle.setBorderTop(BorderStyle.THIN);//上边框
+            titleStyle.setBorderRight(BorderStyle.THIN);//右边框
+
+            CellStyle cellStyle = workBook.createCellStyle();
+            cellStyle.setFont(font);
+            cellStyle.setAlignment(HorizontalAlignment.CENTER);
+            cellStyle.setVerticalAlignment(org.apache.poi.ss.usermodel.VerticalAlignment.CENTER);
+            cellStyle.setWrapText(true);
+            cellStyle.setBorderBottom(BorderStyle.THIN); //下边框
+            cellStyle.setBorderLeft(BorderStyle.THIN);//左边框
+            cellStyle.setBorderTop(BorderStyle.THIN);//上边框
+            cellStyle.setBorderRight(BorderStyle.THIN);//右边框
+
+            if(allList.size() > 0) {
+                int start = 0;
+                for(List<String> rowList : allList) {
+                    HSSFRow row = sheet.createRow(start);
+                    row.setHeightInPoints(24);
+                    for(int i = 0; i < rowList.size(); i++) {
+                        HSSFCell cell = row.createCell(i);
+                        ClientAnchor anchor = new HSSFClientAnchor();
+                        if(start == 0) {
+                            cell.setCellStyle(titleStyle);
+                            // 关键修改
+                            anchor.setDx1(0);
+                            anchor.setDx2(0);
+                            anchor.setDy1(0);
+                            anchor.setDy2(0);
+                            anchor.setCol1(cell.getColumnIndex());
+                            anchor.setRow1(cell.getRowIndex());
+                            anchor.setCol2(cell.getColumnIndex() + 5);
+                            anchor.setRow2(cell.getRowIndex() + 6);
+                            // 结束
+                            Drawing drawing = sheet.createDrawingPatriarch();
+                            Comment comment = null;
+                            String[] textList=null;
+                            DVConstraint constraint =null;
+                            CellRangeAddressList regions =null;
+                            HSSFDataValidation data_validation_list =null;
+//                            switch (rowList.get(i)){
+//                                case "是否为公共项目":
+//                                case "Whether it is a public project":
+//                                    // 加载下拉列表内容
+//                                    //textList= new String[]{"是", "否"};
+//                                    textList= new String[]{MessageUtils.message("excel.yes"), MessageUtils.message("excel.no")};
+//                                    constraint = DVConstraint
+//                                            .createExplicitListConstraint(textList);
+//                                    // 设置数据有效性加载在哪个单元格上,四个参数分别是:起始行、终止行、起始列、终止列
+//                                    regions = new CellRangeAddressList(1,
+//                                            1000, i, i);
+//                                    // 数据有效性对象
+//                                    data_validation_list = new HSSFDataValidation(
+//                                            regions, constraint);
+//                                    sheet.addValidationData(data_validation_list);
+//                                    comment = drawing.createCellComment(anchor);
+//                                    // 输入批注信息
+//                                    //comment.setString(new HSSFRichTextString("是否为公共项目\n" +
+//                                    //"是:公共项目\n" +
+//                                    //"否:普通项目"));
+//                                    comment.setString(new HSSFRichTextString(MessageUtils.message("excel.publicProject")+"\n" +
+//                                            MessageUtils.message("excel.yesPublic")+"\n" +
+//                                            MessageUtils.message("excel.noPublic")));
+//                                    cell.setCellComment(comment);
+//                                    break;
+//                            }
+                        }else {
+                            cell.setCellStyle(cellStyle);
+                        }
+                        cell.setCellValue(rowList.get(i));
+                    }
+                    start++;
+                }
+            }
+            //用于非传统ajax;
+//            String headStr = "attachment; filename=\"" + fileName + "\"";
+//            response.setContentType("APPLICATION/OCTET-STREAM");//返回格式为流
+//            response.setHeader("Content-Disposition", headStr);
+//            //普通下载不需要以上三行,注掉即可
+//            OutputStream os = response.getOutputStream();//在线下载
+            File dir = null;
+            dir = new File(path);
+            // D://cloud/upload 文件上传后所存储的位置,部署到服务器上时配置服务器地址即可
+            if (!dir.exists()) {
+                dir.mkdirs();
+            }
+            FileOutputStream os = new FileOutputStream(path+fileName);//保存到本地
+            workBook.write(os);
+            os.flush();
+            os.close();
+        }catch(Exception e) {
+            e.printStackTrace();
+            //msg.setError("已存在模板名称为["+fileName+"]的文件,请删除后重新下载");
+            msg.setError(MessageUtils.message("file.duplicateTemplate",fileName));
+            return msg;
+        }
+        msg.data= "/upload/"+fileName;
+        return msg;
+    }
 }

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

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

+ 19 - 19
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectServiceImpl.java

@@ -4598,7 +4598,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                                     first= userList.stream().filter(u ->(u.getJobNumber()!=null&&u.getJobNumber().equals(split[1]))||(optional.isPresent()&&u.getCorpwxUserid()!=null&&u.getCorpwxUserid().equals(optional.get().getCorpwxUserid()))).findFirst();
                                     exception=1;
                                 }else {
-                                    first= userList.stream().filter(u -> u.getName().equals(split[0])&&(u.getJobNumber()!=null&&u.getJobNumber().equals(split[1]))).findFirst();
+                                    first= userList.stream().filter(u -> u.getName().equals(split[1])&&(u.getJobNumber()!=null&&u.getJobNumber().equals(split[1]))).findFirst();
                                 }
                             }
                             if (first.isPresent()) {
@@ -4607,7 +4607,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                             } else {
                                 switch (exception){
                                     case 0:throw new Exception("["+split[0]+"]在系统中不存在");
-                                    case 1:throw new Exception("["+split[0]+"]在系统中不存在");
+                                    case 1:throw new Exception("["+split[1]+"]在系统中不存在");
                                 }
                             }
                         }
@@ -4748,7 +4748,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                                     first= userList.stream().filter(u ->(u.getJobNumber()!=null&&u.getJobNumber().equals(split[1]))||(optional.isPresent()&&u.getCorpwxUserid()!=null&&u.getCorpwxUserid().equals(optional.get().getCorpwxUserid()))).findFirst();
                                     exception=1;
                                 }else {
-                                    first= userList.stream().filter(u -> u.getName().equals(split[0])&&(u.getJobNumber()!=null&&u.getJobNumber().equals(split[1]))).findFirst();
+                                    first= userList.stream().filter(u -> u.getName().equals(split[1])&&(u.getJobNumber()!=null&&u.getJobNumber().equals(split[1]))).findFirst();
                                 }
                             }
                             Participation p = new Participation();
@@ -4759,7 +4759,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                             } else {
                                 switch (exception){
                                     case 0:throw new Exception("["+split[0]+"]在系统中不存在");
-                                    case 1:throw new Exception("["+split[0]+"]在系统中不存在");
+                                    case 1:throw new Exception("["+split[1]+"]在系统中不存在");
                                 }
                             }
                         }
@@ -4795,7 +4795,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                                         first= userList.stream().filter(u ->(u.getJobNumber()!=null&&u.getJobNumber().equals(split[1]))||(optional.isPresent()&&u.getCorpwxUserid()!=null&&u.getCorpwxUserid().equals(optional.get().getCorpwxUserid()))).findFirst();
                                         exception=1;
                                     }else {
-                                        first= userList.stream().filter(u -> u.getName().equals(split[0])&&(u.getJobNumber()!=null&&u.getJobNumber().equals(split[1]))).findFirst();
+                                        first= userList.stream().filter(u -> u.getName().equals(split[1])&&(u.getJobNumber()!=null&&u.getJobNumber().equals(split[1]))).findFirst();
                                     }
                                 }
                                 if (first.isPresent()) {
@@ -4809,7 +4809,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                                 } else {
                                     switch (exception){
                                         case 0:throw new Exception("["+split[0]+"]在系统中不存在");
-                                        case 1:throw new Exception("["+split[0]+"]在系统中不存在");
+                                        case 1:throw new Exception("["+split[1]+"]在系统中不存在");
                                     }
                                 }
                             }
@@ -4862,7 +4862,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                                         first= userList.stream().filter(u ->(u.getJobNumber()!=null&&u.getJobNumber().equals(split[1]))||(optional.isPresent()&&u.getCorpwxUserid()!=null&&u.getCorpwxUserid().equals(optional.get().getCorpwxUserid()))).findFirst();
                                         exception=1;
                                     }else {
-                                        first= userList.stream().filter(u -> u.getName().equals(split[0])&&(u.getJobNumber()!=null&&u.getJobNumber().equals(split[1]))).findFirst();
+                                        first= userList.stream().filter(u -> u.getName().equals(split[1])&&(u.getJobNumber()!=null&&u.getJobNumber().equals(split[1]))).findFirst();
                                     }
                                 }
                                 if (first.isPresent()) {
@@ -4877,7 +4877,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                                 } else {
                                     switch (exception){
                                         case 0:throw new Exception("["+split[0]+"]在系统中不存在");
-                                        case 1:throw new Exception("["+split[0]+"]在系统中不存在");
+                                        case 1:throw new Exception("["+split[1]+"]在系统中不存在");
                                     }
                                 }
                             }
@@ -4929,7 +4929,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                                         first= userList.stream().filter(u ->(u.getJobNumber()!=null&&u.getJobNumber().equals(split[1]))||(optional.isPresent()&&u.getCorpwxUserid()!=null&&u.getCorpwxUserid().equals(optional.get().getCorpwxUserid()))).findFirst();
                                         exception=1;
                                     }else {
-                                        first= userList.stream().filter(u -> u.getName().equals(split[0])&&(u.getJobNumber()!=null&&u.getJobNumber().equals(split[1]))).findFirst();
+                                        first= userList.stream().filter(u -> u.getName().equals(split[1])&&(u.getJobNumber()!=null&&u.getJobNumber().equals(split[1]))).findFirst();
                                     }
                                 }
                                 if (first.isPresent()) {
@@ -4944,7 +4944,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                                 } else {
                                     switch (exception){
                                         case 0:throw new Exception("["+split[0]+"]在系统中不存在");
-                                        case 1:throw new Exception("["+split[0]+"]在系统中不存在");
+                                        case 1:throw new Exception("["+split[1]+"]在系统中不存在");
                                     }
                                 }
                             }
@@ -5394,7 +5394,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                             } else {
                                 switch (exception){
                                     case 0:throw new Exception("["+split[0]+"]在系统中不存在");
-                                    case 1:throw new Exception("["+split[0]+"]在系统中不存在");
+                                    case 1:throw new Exception("["+split[1]+"]在系统中不存在");
                                 }
                             }
                         }
@@ -5987,7 +5987,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                                 first= userList.stream().filter(u ->(u.getJobNumber()!=null&&u.getJobNumber().equals(split[1]))||(optional.isPresent()&&u.getCorpwxUserid()!=null&&u.getCorpwxUserid().equals(optional.get().getCorpwxUserid()))).findFirst();
                                 exception=1;
                             }else {
-                                first= userList.stream().filter(u -> u.getName().equals(split[0])&&(u.getJobNumber()!=null&&u.getJobNumber().equals(split[1]))).findFirst();
+                                first= userList.stream().filter(u -> u.getName().equals(split[1])&&(u.getJobNumber()!=null&&u.getJobNumber().equals(split[1]))).findFirst();
                             }
                         }
                         Participation p = new Participation();
@@ -5998,7 +5998,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                         } else {
                             switch (exception){
                                 case 0:throw new Exception("["+split[0]+"]在系统中不存在");
-                                case 1:throw new Exception("["+split[0]+"]在系统中不存在");
+                                case 1:throw new Exception("["+split[1]+"]在系统中不存在");
                             }
                         }
                     }
@@ -6032,7 +6032,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                                         first= userList.stream().filter(u ->(u.getJobNumber()!=null&&u.getJobNumber().equals(split[1]))||(optional.isPresent()&&u.getCorpwxUserid()!=null&&u.getCorpwxUserid().equals(optional.get().getCorpwxUserid()))).findFirst();
                                         exception=1;
                                     }else {
-                                        first= userList.stream().filter(u -> u.getName().equals(split[0])&&(u.getJobNumber()!=null&&u.getJobNumber().equals(split[1]))).findFirst();
+                                        first= userList.stream().filter(u -> u.getName().equals(split[1])&&(u.getJobNumber()!=null&&u.getJobNumber().equals(split[1]))).findFirst();
                                     }
                                 }
                                 Participation p = new Participation();
@@ -6047,7 +6047,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                                 } else {
                                     switch (exception){
                                         case 0:throw new Exception("["+split[0]+"]在系统中不存在");
-                                        case 1:throw new Exception("["+split[0]+"]在系统中不存在");
+                                        case 1:throw new Exception("["+split[1]+"]在系统中不存在");
                                     }
                                 }
                             }
@@ -6099,7 +6099,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                                         first= userList.stream().filter(u ->(u.getJobNumber()!=null&&u.getJobNumber().equals(split[1]))||(optional.isPresent()&&u.getCorpwxUserid()!=null&&u.getCorpwxUserid().equals(optional.get().getCorpwxUserid()))).findFirst();
                                         exception=1;
                                     }else {
-                                        first= userList.stream().filter(u -> u.getName().equals(split[0])&&(u.getJobNumber()!=null&&u.getJobNumber().equals(split[1]))).findFirst();
+                                        first= userList.stream().filter(u -> u.getName().equals(split[1])&&(u.getJobNumber()!=null&&u.getJobNumber().equals(split[1]))).findFirst();
                                     }
                                 }
                                 ProjectAuditor p = new ProjectAuditor();
@@ -6115,7 +6115,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                                 } else {
                                     switch (exception){
                                         case 0:throw new Exception("["+split[0]+"]在系统中不存在");
-                                        case 1:throw new Exception("["+split[0]+"]在系统中不存在");
+                                        case 1:throw new Exception("["+split[1]+"]在系统中不存在");
                                     }
                                 }
                             }
@@ -6167,7 +6167,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                                         first= userList.stream().filter(u ->(u.getJobNumber()!=null&&u.getJobNumber().equals(split[1]))||(optional.isPresent()&&u.getCorpwxUserid()!=null&&u.getCorpwxUserid().equals(optional.get().getCorpwxUserid()))).findFirst();
                                         exception=1;
                                     }else {
-                                        first= userList.stream().filter(u -> u.getName().equals(split[0])&&(u.getJobNumber()!=null&&u.getJobNumber().equals(split[1]))).findFirst();
+                                        first= userList.stream().filter(u -> u.getName().equals(split[1])&&(u.getJobNumber()!=null&&u.getJobNumber().equals(split[1]))).findFirst();
                                     }
                                 }
                                 ProjectCcuser p = new ProjectCcuser();
@@ -6183,7 +6183,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                                 } else {
                                     switch (exception){
                                         case 0:throw new Exception("["+split[0]+"]在系统中不存在");
-                                        case 1:throw new Exception("["+split[0]+"]在系统中不存在");
+                                        case 1:throw new Exception("["+split[1]+"]在系统中不存在");
                                     }
                                 }
                             }

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

@@ -1902,7 +1902,7 @@
         IFNULL(SUM(te.plan_hours),0) AS planHour
         FROM task_executor te
         LEFT JOIN task t ON t.id=te.task_id
-        LEFT JOIN USER u ON te.executor_id=u.id
+        LEFT JOIN user u ON te.executor_id=u.id
         LEFT JOIN task_group tg ON tg.id=t.group_id
         LEFT JOIN project p ON p.id=tg.project_id
         LEFT JOIN department d ON d.department_id=u.department_id