Quellcode durchsuchen

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

hlp vor 1 Jahr
Ursprung
Commit
2f5ee20454
16 geänderte Dateien mit 570 neuen und 13 gelöschten Zeilen
  1. 3 0
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/customer/api.ts
  2. 215 2
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/customer/index.vue
  3. 1 1
      fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/thread/index.vue
  4. 63 4
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ProjectApprovalController.java
  5. 38 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ProjectApprovalLogController.java
  6. 6 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/Project.java
  7. 55 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/ProjectApprovalLog.java
  8. 16 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/ProjectApprovalLogMapper.java
  9. 16 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/ProjectApprovalLogService.java
  10. 2 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/ProjectApprovalService.java
  11. 20 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectApprovalLogServiceImpl.java
  12. 52 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectApprovalServiceImpl.java
  13. 2 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectServiceImpl.java
  14. 19 0
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ProjectApprovalLogMapper.xml
  15. 3 2
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ProjectMapper.xml
  16. 59 4
      fhKeeper/formulahousekeeper/timesheet/src/views/projectApproval/projectApproval.vue

+ 3 - 0
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/customer/api.ts

@@ -0,0 +1,3 @@
+export const MOD = '/customer'
+export const GETSYSFILED = '/sys-dict/getListByCode'
+export const GETPERSONNEL = '/user/getSimpleActiveUserList'

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

@@ -1,11 +1,224 @@
 <template>
-  <div>
-    customer
+  <div class="h-full flex">
+    <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="customerCriteriaForm" label-width="70px" style="max-width: 600px">
+            <el-form-item label="客户名称">
+              <el-input v-model="customerCriteriaForm.clueName" clearable placeholder="请输入"></el-input>
+            </el-form-item>
+            <el-form-item label="客户来源">
+              <el-select v-model="customerCriteriaForm.clueSourceId" placeholder="请选择">
+                <el-option v-for="item in fixedData.CustomSources" :key="item.id" :label="item.name" :value="item.id" />
+              </el-select>
+            </el-form-item>
+            <el-form-item label="电话号码">
+              <el-input v-model="customerCriteriaForm.phone" clearable placeholder="请输入"></el-input>
+            </el-form-item>
+            <el-form-item label="邮箱">
+              <el-input v-model="customerCriteriaForm.email" clearable placeholder="请输入"></el-input>
+            </el-form-item>
+            <el-form-item label="客户行业">
+              <el-select v-model="customerCriteriaForm.customerIndustryId" placeholder="请选择">
+                <el-option v-for="item in fixedData.CustomIndustry" :key="item.id" :label="item.name" :value="item.id" />
+              </el-select>
+            </el-form-item>
+            <el-form-item label="客户级别">
+              <el-select v-model="customerCriteriaForm.customerLevelId" placeholder="请选择">
+                <el-option v-for="item in fixedData.CustomLevel" :key="item.id" :label="item.name" :value="item.id" />
+              </el-select>
+            </el-form-item>
+            <el-form-item label="负责人">
+              <el-select v-model="customerCriteriaForm.inchargerId" placeholder="请选择">
+                <el-option v-for="item in fixedData.Personnel" :key="item.id" :label="item.name" :value="item.id" />
+              </el-select>
+            </el-form-item>
+            <el-form-item label="创建时间">
+              <el-date-picker v-model="customerCriteriaForm.startTime" type="date" placeholder="请选择" :clearable="false"
+                format="YYYY-MM-DD" value-format="YYYY-MM-DD" />
+            </el-form-item>
+            <el-form-item label="">
+              <el-date-picker v-model="customerCriteriaForm.endTime" type="date" placeholder="请选择" :clearable="false"
+                format="YYYY-MM-DD" 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)]">
+          <El-button class="w-full" @click="resetTable()">重置</El-Button>
+          <El-button type="primary" class="w-full" @click="searchTable()">搜索</El-Button>
+        </div>
+      </div>
+    </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="flex justify-end pb-3">
+          <el-button type="primary">新建客户</el-button>
+          <el-button type="primary" @click="batchTransfer()">批量转移</el-button>
+          <el-button type="primary" @clicl="batchDelete()">批量删除</el-button>
+          <el-button type="primary">回收站</el-button>
+          <el-button type="primary">导入</el-button>
+          <el-button type="primary">导出</el-button>
+        </div>
+        <div class="flex-1 w-full overflow-hidden">
+          <el-table ref="clueTableRef" :data="clueTable" border v-loading="allLoading.clueTableLading"
+            style="width: 100%;height: 100%;">
+            <el-table-column type="selection" width="55" />
+            <el-table-column prop="clueName" label="客户名称" width="180">
+              <template #default="scope">
+                <el-button link type="primary" size="large" @click.prevent="toClueTableDetail(scope.row)">{{ scope.row.clueName
+                }}</el-button>
+              </template>
+            </el-table-column>
+            <el-table-column prop="clueSourceId" label="客户来源" width="180"></el-table-column>
+            <el-table-column prop="phone" label="电话号码" width="180"></el-table-column>
+            <el-table-column prop="email" label="邮箱" width="180"></el-table-column>
+            <el-table-column prop="customerIndustryId" label="客户行业" width="180"></el-table-column>
+            <el-table-column prop="customerLevelId" label="客户级别" width="180"></el-table-column>
+            <el-table-column prop="inchargerId" 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">
+              <template #default="scope">
+                <el-button link type="primary" size="large">编辑</el-button>
+                <el-button link type="primary" size="large">新建任务</el-button>
+                <el-button link type="danger" size="large" @click.prevent="deleteRow(scope.$index)">删除</el-button>
+              </template>
+            </el-table-column>
+          </el-table>
+        </div>
+        <div class="flex justify-end pt-3">
+          <el-pagination layout="total, prev, pager, next, sizes" :total="clueTotalTable" :hide-on-single-page="true" />
+        </div>
+      </div>
+    </div>
+
+    <!-- 弹窗 -->
+    
   </div>
 </template>
 
 <script lang="ts" setup>
+import { ref, reactive, onMounted, inject } from "vue";
+import { MOD, GETSYSFILED, GETPERSONNEL } from './api.ts'
+import { getAllListByCode, getFromValue, resetFromValue, getFirstDayOfMonth, getLastDayOfMonth, formatDate } from '@/utils/tools'
+import { post, get } from "@/utils/request";
+import { useRouter, useRoute } from "vue-router";
+
+// 定义类型
+interface fixedDataInterface {
+  id: string | number,
+  companyId: string | number,
+  code: string,
+  name: string,
+  seq: string | number,
+}
+
+interface personnelInterface {
+  id: string | number,
+  name: string,
+  phone: string,
+  jobNumber: string
+}
+
+interface customerCriteriaFormType { // 线索筛选条件类型
+  clueName: string,
+  clueSourceId: string | number,
+  phone: string,
+  email: string,
+  customerIndustryId: string | number,
+  customerLevelId: string | number,
+  inchargerId: string | number,
+  startTime: string | number,
+  endTime: string | number,
+  pageIndex: string | number,
+  pageFrom: string | number
+}
+
+// 定义变量
+const route = useRoute()
+const router = useRouter()
+const globalPopup = inject<GlobalPopup>('globalPopup')
+const customerCriteriaForm = reactive<customerCriteriaFormType>({ // 筛选条件form
+  clueName: '',
+  clueSourceId: '',
+  phone: '',
+  email: '',
+  customerIndustryId: '',
+  customerLevelId: '',
+  inchargerId: '',
+  startTime: getFirstDayOfMonth(new Date()),
+  endTime: formatDate(new Date()),
+  pageIndex: 1,
+  pageFrom: 10
+})
+const allLoading = reactive({
+  clueTableLading: false,
+})
+const fixedData = reactive({
+  CustomSources: [] as fixedDataInterface[],
+  CustomIndustry: [] as fixedDataInterface[],
+  CustomLevel: [] as fixedDataInterface[],
+  Personnel: [] as personnelInterface[]
+})
+const clueTable = ref([{ clueName: '客户名称', clueSourceId: '客户来源', id: 123456789 }]) // 线索table数据
+const clueTotalTable = ref(0) // 线索 table 数据总数
+
+// 定义方法
+function searchTable() {
+  getClueTable()
+}
+
+function resetTable() {
+  let newResetForm = resetFromValue(customerCriteriaForm, { startTime: getFirstDayOfMonth(new Date()), endTime: formatDate(new Date()), pageIndex: 1, pageFrom: 10 })
+  Object.assign(customerCriteriaForm, newResetForm)
+  getClueTable()
+}
+
+function deleteRow(_row: any) {
+  console.log('点击了删除')
+}
+
+function batchTransfer() {
+  console.log('点击了批量转移')
+}
+
+function batchDelete() {
+  console.log('批量删除')
+}
+
+function toClueTableDetail(_row: any) {
+  console.log('点击跳转详情')
+}
+
+function getClueTable() {
+  let valueForm = getFromValue(customerCriteriaForm)
+  console.log(valueForm, '<=== valueForm')
+}
+
+async function getSystemField() {
+  const systemField = getAllListByCode(['客户来源', '客户行业', '客户级别'])
+  for (let i in systemField) {
+    const { data } = await get(`${GETSYSFILED}?code=${systemField[i]}`)
+    for (let key of Object.keys(fixedData)) {
+      if (systemField[i] == key) {
+        Object.assign(fixedData, { [key]: data })
+      }
+    }
+  }
+
+  const { data } = await post(GETPERSONNEL, {})
+  fixedData.Personnel = data.map((item: any) => {
+    const { id, name, phone, jobNumber } = item
+    return {
+      id, name, phone, jobNumber
+    }
+  })
+}
 
+onMounted(() => {
+  getSystemField()
+  getClueTable()
+})
 </script>
 
 <style lang="scss" scoped></style>

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

@@ -52,10 +52,10 @@
     <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="flex justify-end pb-3">
-          <el-button type="primary">回收站</el-button>
           <el-button type="primary">新建线索</el-button>
           <el-button type="primary" @click="batchTransfer()">批量转移</el-button>
           <el-button type="primary" @clicl="batchDelete()">批量删除</el-button>
+          <el-button type="primary">回收站</el-button>
           <el-button type="primary">导入</el-button>
           <el-button type="primary">导出</el-button>
         </div>

+ 63 - 4
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ProjectApprovalController.java

@@ -15,10 +15,12 @@ import org.springframework.web.bind.annotation.RequestMapping;
 
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
 
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
 import java.time.LocalDate;
+import java.time.LocalDateTime;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Optional;
@@ -64,6 +66,10 @@ public class ProjectApprovalController {
     private ParticipationService participationService;
     @Resource
     private SysFunctionService sysFunctionService;
+    @Resource
+    private ProjectApprovalLogService projectApprovalLogService;
+    @Resource
+    private ReportService reportService;
 
     /**
      * 分页获取项目列表
@@ -148,6 +154,18 @@ public class ProjectApprovalController {
             }
             projectApprovalCheckService.saveOrUpdateBatch(projectApprovalCheckList);
         }
+        //新增操作记录数据
+        ProjectApprovalLog projectApprovalLog=new ProjectApprovalLog();
+        projectApprovalLog.setCreateTime(LocalDateTime.now());
+        projectApprovalLog.setProjectApprovalId(projectApproval.getId());
+        if(projectApproval.getId()==null){
+            //提交
+            projectApprovalLog.setType(0);
+        }else {
+            //编辑
+            projectApprovalLog.setType(1);
+        }
+        projectApprovalLogService.save(projectApprovalLog);
         return msg;
     }
 
@@ -203,12 +221,15 @@ public class ProjectApprovalController {
         Optional<ProjectApprovalCheck> first = projectApprovalChecks.stream().filter(p -> p.getUserId().equals(user.getId())&&p.getStatus()==0).findFirst();
 //        boolean hasAllPriviledge = sysFunctionService.hasPriviledge(user.getRoleId(), "管理全部立项申请");
 //        boolean hasCheckPriviledge = sysFunctionService.hasPriviledge(user.getRoleId(), "审核立项申请");
-        if(projectApprovalChecks.size()>0){
-            if(!first.isPresent()){
-                msg.setError("审核人验证失败,请按照审核人顺序审核");
-                return msg;
+        if(checkType!=3){
+            if(projectApprovalChecks.size()>0){
+                if(!first.isPresent()){
+                    msg.setError("审核人验证失败,请按照审核人顺序审核");
+                    return msg;
+                }
             }
         }
+        ProjectApprovalLog projectApprovalLog=new ProjectApprovalLog();
         switch (checkType){
             /*审核通过*/
             case 1:
@@ -257,18 +278,56 @@ public class ProjectApprovalController {
                     projectBasecostService.saveBatch(projectBasecostList);
                     participationService.saveBatch(participationList);
                     projectAuditorService.saveBatch(projectAuditorList);
+                    //新增操作记录数据
+                    projectApprovalLog.setCreateTime(LocalDateTime.now());
+                    projectApprovalLog.setProjectApprovalId(projectApproval.getId());
+                    //通过
+                    projectApprovalLog.setType(2);
+                    projectApprovalLogService.save(projectApprovalLog);
                 }
                 break;
             /*驳回*/
             case 2:
                 projectApproval.setStatus(2);
                 projectApprovalService.updateById(projectApproval);
+                //新增操作记录数据
+                projectApprovalLog.setCreateTime(LocalDateTime.now());
+                projectApprovalLog.setProjectApprovalId(projectApproval.getId());
+                //驳回
+                projectApprovalLog.setType(3);
+                projectApprovalLogService.save(projectApprovalLog);
                 break;
             /*撤销*/
             case 3:
+                Project project = projectService.getOne(new LambdaQueryWrapper<Project>().eq(Project::getApproveId,projectApproval.getId()));
+                if(project!=null){
+                    int count = reportService.count(new LambdaQueryWrapper<Report>().eq(Report::getProjectId, project.getId()));
+                    if(count>0){
+                        msg.setError("已存在填报数据无法撤销立项");
+                        return msg;
+                    }
+                    projectAuditorService.remove(new LambdaQueryWrapper<ProjectAuditor>().eq(ProjectAuditor::getProjectId,project.getId()));
+                    projectBasecostService.remove(new LambdaQueryWrapper<ProjectBasecost>().eq(ProjectBasecost::getProjectId,project.getId()));
+                    participationService.remove(new LambdaQueryWrapper<Participation>().eq(Participation::getProjectId,project.getId()));
+                    project.deleteById(project.getId());
+                }
+                projectApproval.setStatus(3);
+                projectApprovalService.updateById(projectApproval);
+                //新增操作记录数据
+                projectApprovalLog.setCreateTime(LocalDateTime.now());
+                projectApprovalLog.setProjectApprovalId(projectApproval.getId());
+                //驳回
+                projectApprovalLog.setType(4);
+                projectApprovalLogService.save(projectApprovalLog);
                 break;
         }
         return msg;
     }
+
+
+    @RequestMapping("/importData")
+    public HttpRespMsg importData(MultipartFile multipartFile){
+        return projectApprovalService.importData(multipartFile);
+    }
 }
 

+ 38 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ProjectApprovalLogController.java

@@ -0,0 +1,38 @@
+package com.management.platform.controller;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.management.platform.entity.ProjectApprovalLog;
+import com.management.platform.service.ProjectApprovalLogService;
+import com.management.platform.util.HttpRespMsg;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2024-03-21
+ */
+@RestController
+@RequestMapping("/project-approval-log")
+public class ProjectApprovalLogController {
+    @Resource
+    private ProjectApprovalLogService projectApprovalLogService;
+
+    @RequestMapping("/listById")
+    public HttpRespMsg listById(Integer id){
+        HttpRespMsg msg=new HttpRespMsg();
+        List<ProjectApprovalLog> list = projectApprovalLogService.list(new LambdaQueryWrapper<ProjectApprovalLog>().eq(ProjectApprovalLog::getProjectApprovalId, id).orderByAsc(ProjectApprovalLog::getCreateTime));
+        msg.setData(list);
+        return msg;
+    }
+
+}
+

+ 6 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/Project.java

@@ -459,6 +459,12 @@ public class Project extends Model<Project> {
     @TableField("from_outside")
     private Integer fromOutside;
 
+    /**
+     * 立项id
+     */
+    @TableField("approve_id")
+    private Integer approveId;
+
     /**
      * 预估工时表:任务分组
      */

+ 55 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/ProjectApprovalLog.java

@@ -0,0 +1,55 @@
+package com.management.platform.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import com.baomidou.mybatisplus.annotation.TableId;
+import java.time.LocalDateTime;
+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-03-21
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+public class ProjectApprovalLog extends Model<ProjectApprovalLog> {
+
+    private static final long serialVersionUID=1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     * 操作人姓名
+     */
+    @TableField("user_name")
+    private String userName;
+
+    @TableField("create_time")
+    private LocalDateTime createTime;
+
+    /**
+     * 操作类型 0-提交 1-编辑 2-通过 3-驳回 4-撤销
+     */
+    @TableField("type")
+    private Integer type;
+
+    @TableField("project_approval_id")
+    private Integer projectApprovalId;
+
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+}

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

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

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

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

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

@@ -4,6 +4,7 @@ import com.management.platform.entity.ProjectApproval;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.management.platform.util.HttpRespMsg;
 import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.multipart.MultipartFile;
 
 import javax.servlet.http.HttpServletRequest;
 
@@ -19,4 +20,5 @@ public interface ProjectApprovalService extends IService<ProjectApproval> {
 
     HttpRespMsg listByPage(Integer pageIndex, Integer pageSize, String keyword, Integer searchField, String statuses, Integer category,Integer viewId, HttpServletRequest request);
 
+    HttpRespMsg importData(MultipartFile multipartFile);
 }

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

@@ -0,0 +1,20 @@
+package com.management.platform.service.impl;
+
+import com.management.platform.entity.ProjectApprovalLog;
+import com.management.platform.mapper.ProjectApprovalLogMapper;
+import com.management.platform.service.ProjectApprovalLogService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author Seyason
+ * @since 2024-03-21
+ */
+@Service
+public class ProjectApprovalLogServiceImpl extends ServiceImpl<ProjectApprovalLogMapper, ProjectApprovalLog> implements ProjectApprovalLogService {
+
+}

+ 52 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectApprovalServiceImpl.java

@@ -9,13 +9,19 @@ import com.management.platform.mapper.ProjectMapper;
 import com.management.platform.mapper.UserMapper;
 import com.management.platform.service.*;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.management.platform.util.ExcelUtil;
 import com.management.platform.util.HttpRespMsg;
+import org.apache.poi.xssf.usermodel.XSSFRow;
+import org.apache.poi.xssf.usermodel.XSSFSheet;
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
 import org.springframework.stereotype.Service;
 import org.springframework.util.StringUtils;
 import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.multipart.MultipartFile;
 
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
+import java.io.*;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -99,14 +105,21 @@ public class ProjectApprovalServiceImpl extends ServiceImpl<ProjectApprovalMappe
             List<ProjectApprovalCheck> checkList = approvalCheckList.stream().filter(a -> a.getProjectApprovalId().equals(r.getId())).collect(Collectors.toList());
             Optional<ProjectApprovalCheck> first = checkList.stream().filter(c -> c.getUserId().equals(user.getId())&&c.getStatus()==0).findFirst();
             if(first.isPresent()){
+                //针对当前登录人员 作为审核人检查是否有审核权限
                 boolean anyMatch = checkList.stream().anyMatch(c -> c.getSeq() < first.get().getSeq() && c.getStatus() == 0);
                 if(!anyMatch){
                     canCheck=1;
                 }
             }
+            //有权限可编辑
             if(hasAllPriviledge||hasCheckPriviledge){
                 canCheck=1;
             }
+            //全部审核通过的情况不可编辑
+            boolean b = checkList.stream().allMatch(c -> c.getStatus().equals(1));
+            if(b){
+                canCheck=0;
+            }
             r.setCanChecked(canCheck);
         });
         result.put("records",records);
@@ -114,4 +127,43 @@ public class ProjectApprovalServiceImpl extends ServiceImpl<ProjectApprovalMappe
         msg.setData(result);
         return msg;
     }
+
+    @Override
+    public HttpRespMsg importData(MultipartFile multipartFile) {
+        String fileName = multipartFile.getOriginalFilename();
+        File file = new File(fileName == null ? "file" : fileName);
+        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();
+            //然后解析表格
+            XSSFWorkbook workbook = new XSSFWorkbook(file);
+            XSSFSheet sheet = workbook.getSheetAt(0);
+            //由于第一行需要指明列对应的标题
+            int rowNum = sheet.getLastRowNum();
+            for (int rowIndex = 0; rowIndex <= rowNum; rowIndex++) {
+                XSSFRow row = sheet.getRow(rowIndex);
+                if (row == null) {
+                    continue;
+                }
+                //跳过空行
+                if (ExcelUtil.isRowEmpty(row)) {
+                    continue;
+                }
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
 }

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

@@ -11716,6 +11716,8 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                         break;
                     case "Z09":categoryName="售后工程项目";
                         break;
+                    case "Z10":categoryName="运维项目";
+                        break;
                     default:categoryName="未知";
                 }
                 String finalCategoryName = categoryName;

+ 19 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ProjectApprovalLogMapper.xml

@@ -0,0 +1,19 @@
+<?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.ProjectApprovalLogMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.management.platform.entity.ProjectApprovalLog">
+        <id column="id" property="id" />
+        <result column="user_name" property="userName" />
+        <result column="create_time" property="createTime" />
+        <result column="type" property="type" />
+        <result column="project_approval_id" property="projectApprovalId" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, user_name, create_time, type, project_approval_id
+    </sql>
+
+</mapper>

Datei-Diff unterdrückt, da er zu groß ist
+ 3 - 2
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ProjectMapper.xml


+ 59 - 4
fhKeeper/formulahousekeeper/timesheet/src/views/projectApproval/projectApproval.vue

@@ -40,7 +40,14 @@
                         <el-table-column type="selection" width="60" :selectable="isSelectable">
                         </el-table-column>
                         <el-table-column prop="projectCode" :label="$t('Itemno')"  width="150"></el-table-column>
-                        <el-table-column prop="projectName" :label="$t('headerTop.projectName')" min-width="250" ></el-table-column>
+                        <el-table-column prop="projectName" :label="$t('headerTop.projectName')" min-width="250" sortable="custom">
+                        <template slot-scope="scope">
+                            <div> 
+                                <el-button type="text" v-if="scope.row.isPublic==0" @click="showProjectApprovalDeatil(scope.row)">{{scope.row.projectName}}</el-button>
+                                <span v-else>{{scope.row.projectName}}</span>
+                            </div>
+                        </template>
+                    </el-table-column>
                         <el-table-column prop="categoryName" :label="$t('projectclassification')"  width="140"></el-table-column>
                         <el-table-column prop="isPublic" :label="'项目类型'"  width="140">
                             <template slot-scope="scope">{{scope.row.isPublic==0?"正式项目":"非项目"}}</template>
@@ -71,10 +78,10 @@
                         </el-table-column>
                         <el-table-column :label="$t('operation')" :width="300" align="left" fixed="right">
                             <template slot-scope="scope">
-                                <el-button size="mini" type="primary" @click="handleAdd(scope.$index, scope.row)">{{'编辑'}}</el-button>
+                                <el-button size="mini" type="primary" v-if="(permissions.projectApprovalEdit||permissions.projectApprovalCheck)&&scope.row.status==2&&scope.row.canChecked==1" @click="handleAdd(scope.$index, scope.row)">{{'编辑'}}</el-button>
                                 <el-button size="mini" v-if="(permissions.projectApprovalEdit||permissions.projectApprovalCheck) && scope.row.status==0 &&scope.row.canChecked==1 "  @click="check(scope.row,1)">{{'通过'}}</el-button>
-                                <el-button size="mini" v-if="(permissions.projectApprovalEdit||permissions.projectApprovalCheck) && scope.row.status!=2 &&scope.row.canChecked==1" @click="check(scope.row,2)">{{'驳回'}}</el-button>
-                                <el-button size="mini" v-if="(permissions.projectApprovalEdit ||permissions.projectApprovalCheck)&&scope.row.canChecked==1 && scope.row.status==1" @click="check(scope.row,3)">{{'撤销'}}</el-button>
+                                <el-button size="mini" v-if="(permissions.projectApprovalEdit||permissions.projectApprovalCheck) && scope.row.status==0 &&scope.row.canChecked==1" @click="check(scope.row,2)">{{'驳回'}}</el-button>
+                                <el-button size="mini" v-if="(permissions.projectApprovalEdit ||permissions.projectApprovalCheck) && scope.row.status==1" @click="check(scope.row)">{{'撤销'}}</el-button>
                             </template>
                         </el-table-column>
                     </el-table>
@@ -283,6 +290,43 @@
                             <el-button type="primary" @click="userDetailVisible = false" >{{ $t('btn.determine') }}</el-button>
                         </div>
                     </el-dialog>
+
+                    <!--查看立项-->
+                    <el-dialog :title="$t('Checkthedetails')" v-if="projectApprovalDetailVisible" :visible.sync="projectApprovalDetailVisible" :close-on-click-modal="false" customClass="customWidth" width="400px">
+                        <div class="line"><span>{{'项目编号:'}}</span><span>{{projectApprocalDetail.projectCode}}</span></div>
+                        <div class="line"><span>{{'项目名称:'}}</span><span>{{projectApprocalDetail.projectName}}</span></div>
+                        <div class="line"><span>{{'项目分类:'}}</span><span>{{projectApprocalDetail.categoryName}}</span></div>
+                        <div class="line"><span>{{'项目类型:'}}</span><span>{{projectApprocalDetail.isPublic==0?"正式项目":"非项目"}}</span></div>
+                        <div class="line"><span>{{'项目描述:'}}</span><span>{{projectApprocalDetail.projectDesc}}</span></div>
+                        <div class="line"><span>{{'全部参与人:'}}</span>
+                            <span v-if="user.userNameNeedTranslate != 1">{{projectApprocalDetail.participationApprovalList.map(v=>v.userName).join(",")}}</span>
+                            <span v-if="user.userNameNeedTranslate == 1"><ww-open-data type='userName' :openid='projectApprocalDetail.participationApprovalList.map(v=>v.userName).join(",")'></ww-open-data></span>
+                        </div>
+                        <div class="line"><span>{{'项目经理:'}}</span>
+                            <span v-if="user.userNameNeedTranslate != 1">{{projectApprocalDetail.inchargerName}}</span>
+                            <span v-if="user.userNameNeedTranslate == 1"><ww-open-data type='userName' :openid='projectApprocalDetail.inchargerName'></ww-open-data></span>
+                        </div>
+                        <div class="line"><span>{{'日报审核人:'}}</span>
+                            <span v-if="user.userNameNeedTranslate != 1">{{projectApprocalDetail.projectApprovalAuditorList.map(v=>v.auditorName).join(",")}}</span>
+                            <span v-if="user.userNameNeedTranslate == 1"><ww-open-data type='userName' :openid='projectApprocalDetail.projectApprovalAuditorList.map(v=>v.auditorName).join(",")'></ww-open-data></span>
+                        </div>
+                        <div class="line"><span>{{'级别:'}}</span><span>{{importanceListLable[projectApprocalDetail.level-1]}}</span></div>
+                        <div class="line"><span>{{'合同金额:'}}</span><span>{{projectApprocalDetail.contractAmount}}</span></div>
+                        <el-divider></el-divider>
+                        <div class="line">
+                            <span>成本基线</span>
+                        </div>
+                        <div class="line">
+                            <span>{{'计划开始日期:'}}</span><span>{{projectApprocalDetail.planStartDate}}</span>
+                            <span>{{'计划结束日期:'}}</span><span>{{projectApprocalDetail.planEndDate}}</span>
+                        </div>
+                        <div class="line" v-for="(item,index) in projectApprocalDetail.projectApprovalBasecostList">
+                            <span>{{item.baseName+":"}}</span><span>{{item.baseAmount}}</span>
+                        </div>
+                        <div slot="footer" class="dialog-footer">
+                            <el-button type="primary" @click="projectApprovalDetailVisible = false" >{{'关闭'}}</el-button>
+                        </div>
+                    </el-dialog>
             </div>
         </div>
     </section>
@@ -350,6 +394,8 @@ return {
     }],
     idx: 1,
     tableHeight: 0,
+    projectApprovalDetailVisible:false,
+    projectApprocalDetail:{},
 }
 },
 computed: {},
@@ -1133,6 +1179,15 @@ methods: {
             });
             }
         );
+    },
+    showProjectApprovalDeatil(item){
+        this.projectApprovalDetailVisible=true
+        this.http.post('/project-approval/getDetail', {id: item.id},
+        res => {
+        if (res.code == "ok") {
+            this.projectApprocalDetail=res.data
+        }
+        });
     }
 },
 }