浏览代码

费用报销修改

Min 1 年之前
父节点
当前提交
7394bf4bfc

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

@@ -87,7 +87,7 @@ public class ReportController {
     @Resource
     private SysFunctionMapper sysFunctionMapper;
     @Resource
-    ProjectCategoryMapper projectCategoryMapper;
+    private ProjectCategoryMapper projectCategoryMapper;
     @Resource
     private UserCorpwxTimeMapper userCorpwxTimeMapper;
     @Resource

+ 21 - 1
fhKeeper/formulahousekeeper/management-platform-import/src/main/java/com/management/platform/entity/ExpenseItem.java

@@ -5,6 +5,8 @@ import com.baomidou.mybatisplus.extension.activerecord.Model;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableField;
 import java.io.Serializable;
+import java.util.List;
+
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.experimental.Accessors;
@@ -15,7 +17,7 @@ import lombok.experimental.Accessors;
  * </p>
  *
  * @author Seyason
- * @since 2021-12-06
+ * @since 2023-06-28
  */
 @Data
 @EqualsAndHashCode(callSuper = false)
@@ -39,12 +41,30 @@ public class ExpenseItem extends Model<ExpenseItem> {
     @TableField("project_id")
     private Integer projectId;
 
+    /**
+     * 子项目id
+     */
+    @TableField("sub_project_id")
+    private Integer subProjectId;
+
     /**
      * 项目名称
      */
     @TableField(exist = false)
     private  String projectName;
 
+    /**
+     * 子项目名称
+     */
+    @TableField(exist = false)
+    private  String subProjectName;
+
+    /**
+     * 子项目数据
+     */
+    @TableField(exist = false)
+    private List<SubProject> subProjectList;
+
 
     /**
      * 费用日期

+ 47 - 23
fhKeeper/formulahousekeeper/management-platform-import/src/main/java/com/management/platform/service/impl/ExpenseSheetServiceImpl.java

@@ -80,6 +80,8 @@ public class ExpenseSheetServiceImpl extends ServiceImpl<ExpenseSheetMapper, Exp
     @Resource
     private WxCorpInfoService wxCorpInfoService;
     @Resource
+    private SubProjectMapper subProjectMapper;
+    @Resource
     private InformationService informationService;
     @Resource
     private SysRoleFunctionMapper sysRoleFunctionMapper;
@@ -323,10 +325,19 @@ public class ExpenseSheetServiceImpl extends ServiceImpl<ExpenseSheetMapper, Exp
         ExpenseSheet expenseSheet = expenseSheetMapper.selectById(id);
         List<ExpenseItem> list = expenseItemMapper.selectList(new QueryWrapper<ExpenseItem>().eq("expense_id", id));
         List<Project> Project = projectMapper.selectList(new QueryWrapper<Project>().eq("company_id", expenseSheet.getCompanyId()));
+        List<SubProject> SubProject = subProjectMapper.selectList(new QueryWrapper<SubProject>().eq("company_id", expenseSheet.getCompanyId()));
         for (ExpenseItem expenseItem : list) {
             for (Project project : Project) {
                 if ((project.getId().equals(expenseItem.getProjectId()))){
                     expenseItem.setProjectName(project.getProjectName());
+                    List<SubProject> collect = SubProject.stream().filter(s -> s.getProjectId().equals(project.getId())).collect(Collectors.toList());
+                    expenseItem.setSubProjectList(collect);
+                    break;
+                }
+            }
+            for (SubProject subProject : SubProject) {
+                if ((subProject.getId().equals(expenseItem.getSubProjectId()))){
+                    expenseItem.setSubProjectName(subProject.getName());
                     break;
                 }
             }
@@ -444,7 +455,9 @@ public class ExpenseSheetServiceImpl extends ServiceImpl<ExpenseSheetMapper, Exp
                 //获取全部人员
                 List<User> userList = userMapper.selectList(new QueryWrapper<User>().eq("company_id", user.getCompanyId()));
                 List<Project> projectList = projectMapper.selectList(new QueryWrapper<Project>().eq("company_id", user.getCompanyId()));
+                List<SubProject> subProjectList = subProjectMapper.selectList(new QueryWrapper<SubProject>().eq("company_id", user.getCompanyId()));
                 List<SysRichFunction> functionList = sysFunctionMapper.getRoleFunctions(user.getRoleId(), "费用审核");
+                List<ExpenseMainType> expenseMainTypeList = expenseMainTypeService.list(new QueryWrapper<ExpenseMainType>().eq("company_id", user.getCompanyId()));
                 List<ExpenseType> expenseTypeList = expenseTypeMapper.selectList(new QueryWrapper<ExpenseType>().eq("company_id",user.getCompanyId()));
                 //由于第一行需要指明报销人列对应的标题
                 XSSFRow firstRow = sheet.getRow(2);
@@ -530,19 +543,17 @@ public class ExpenseSheetServiceImpl extends ServiceImpl<ExpenseSheetMapper, Exp
                 }
                 expenseSheet.setOperatorId(user.getId());
                 expenseSheet.setRemark(remarksCell.getStringCellValue());
-                switch (expenseTypeCell.getStringCellValue()) {
-                    case "一般":
-                    case "general":
-                        expenseSheet.setType(0);
-                        break;
-                    case "差旅":
-                    case "travel on business":
-                        expenseSheet.setType(1);
-                        break;
-                    case "外包":
-                    case "outsource":
-                        expenseSheet.setType(2);
-                        break;
+                if(StringUtils.isEmpty(expenseTypeCell.getStringCellValue())){
+                    msg.setError("请填写费用报销类型");
+                    return msg;
+                }
+                if(!expenseMainTypeList.stream().anyMatch(el->el.getName().equals(expenseTypeCell.getStringCellValue()))){
+                    msg.setError("当前费用类型["+expenseTypeCell.getStringCellValue()+"]不存在");
+                    return msg;
+                }
+                Optional<ExpenseMainType> any = expenseMainTypeList.stream().filter(el -> el.getName().equals(expenseTypeCell.getStringCellValue())).findAny();
+                if(any.isPresent()){
+                    expenseSheet.setType(any.get().getId());
                 }
                 expenseSheetMapper.insert(expenseSheet);
                 //前提需要指定第一二行为报销人数据 从第三行数据开始处理 报销单据详情
@@ -582,17 +593,19 @@ public class ExpenseSheetServiceImpl extends ServiceImpl<ExpenseSheetMapper, Exp
                     if (ExcelUtil.isRowEmpty(row)) {
                         continue;
                     }
-                    //项目编号 费用日期 发拍种类 费用类型 费用金额 发票号 税率 税额 备注
+                    //项目编号 子项目编号 费用日期 发拍种类 费用类型 费用金额 发票号 税率 税额 备注
                     XSSFCell codeCell = row.getCell(0);
-                    XSSFCell happenDateCell = row.getCell(1);
-                    XSSFCell invoiceTypeCell = row.getCell(2);
-                    XSSFCell subExpenseTypeCell = row.getCell(3);
-                    XSSFCell amountCell = row.getCell(4);
-                    XSSFCell invoiceNoCell = row.getCell(5);
-                    XSSFCell taxPercentCell = row.getCell(6);
-                    XSSFCell remarkCell = row.getCell(7);
+                    XSSFCell subCodeCell = row.getCell(1);
+                    XSSFCell happenDateCell = row.getCell(2);
+                    XSSFCell invoiceTypeCell = row.getCell(3);
+                    XSSFCell subExpenseTypeCell = row.getCell(4);
+                    XSSFCell amountCell = row.getCell(5);
+                    XSSFCell invoiceNoCell = row.getCell(6);
+                    XSSFCell taxPercentCell = row.getCell(7);
+                    XSSFCell remarkCell = row.getCell(8);
 
                     if (codeCell != null) codeCell.setCellType(CellType.STRING);
+                    if (subCodeCell != null) subCodeCell.setCellType(CellType.STRING);
                     if (happenDateCell != null) happenDateCell.setCellType(CellType.NUMERIC);
                     if (invoiceTypeCell != null) invoiceTypeCell.setCellType(CellType.STRING);
                     if (subExpenseTypeCell != null) subExpenseTypeCell.setCellType(CellType.STRING);
@@ -608,9 +621,20 @@ public class ExpenseSheetServiceImpl extends ServiceImpl<ExpenseSheetMapper, Exp
                     System.out.println(codeCell.getStringCellValue());
                     Optional<Project> project = projectList.stream().filter(pro ->(StringUtils.isEmpty(pro.getProjectCode())?"":pro.getProjectCode()).equals(codeCell.getStringCellValue())
                             || (StringUtils.isEmpty(pro.getProjectName())?"":pro.getProjectName()).equals(codeCell.getStringCellValue())).findFirst();
-                    if (project.isPresent()) {
-                        expenseItem.setProjectId(project.get().getId());
+
+                    if (!project.isPresent()) {
+                        msg.setError("项目["+codeCell+"]不存在");
+                        return msg;
+                    }
+                    expenseItem.setProjectId(project.get().getId());
+                    List<SubProject> subProjects = subProjectList.stream().filter(sl -> sl.getProjectId().equals(project.get().getId())).collect(Collectors.toList());
+                    Optional<SubProject> subProject = subProjects.stream().filter(s ->(StringUtils.isEmpty(s.getCode())?"":s.getCode()).equals(subCodeCell.getStringCellValue())
+                            || (StringUtils.isEmpty(s.getName())?"":s.getName()).equals(subCodeCell.getStringCellValue())).findFirst();
+                    if(!subProject.isPresent()){
+                        msg.setError("子项目["+subCodeCell.getStringCellValue()+"]不属于项目["+codeCell.getStringCellValue()+"]");
+                        return msg;
                     }
+                    expenseItem.setSubProjectId(subProject.get().getId());
                     expenseItem.setExpenseId(expenseSheet.getId());
                     if(happenDateCell!=null && !happenDateCell.toString().trim().equals("")){
                         LocalDate happenDate = Instant.ofEpochMilli(happenDateCell.getDateCellValue().getTime())

+ 27 - 0
fhKeeper/formulahousekeeper/management-platform-import/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java

@@ -4179,6 +4179,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
             Integer companyId = company.getId();
             List<UserCustom> userCustomList = userCustomMapper.selectList(new QueryWrapper<UserCustom>().eq("company_id", companyId));
             WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", companyId));
+            List<ReportCustom> reportCustomList = reportCustomMapper.selectList(new QueryWrapper<ReportCustom>().eq("company_id", companyId));
             SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
             List<List<String>> dataList=new ArrayList<>();
             List<String> titles = new ArrayList<String>();
@@ -4233,6 +4234,11 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
             if (timeType.getCustomTextActive() == 1) {
                 titles.add(timeType.getCustomTextName());
             }
+            if(reportCustomList.size()>0){
+                reportCustomList.forEach(rl->{
+                    titles.add(rl.getCustomName());
+                });
+            }
             //项目管理专业版,需要显示任务分组和投入阶段
             if (company.getPackageProject() == 1) {
 //                titles.add("任务分组");
@@ -4480,6 +4486,27 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                 if (timeType.getCustomTextActive() == 1) {
                     item.add(map.get("customText") != null?map.get("customText").toString():"");
                 }
+                if(reportCustomList.size()>0){
+                    for (int i = 0; i < reportCustomList.size(); i++) {
+                        switch (i){
+                            case 0:
+                                item.add(map.get("rPlate1") != null?map.get("rPlate1").toString():"");
+                            break;
+                            case 1:
+                                item.add(map.get("rPlate2") != null?map.get("rPlate2").toString():"");
+                            break;
+                            case 2:
+                                item.add(map.get("rPlate3") != null?map.get("rPlate3").toString():"");
+                            break;
+                            case 3:
+                                item.add(map.get("rPlate4") != null?map.get("rPlate4").toString():"");
+                            break;
+                            case 4:
+                                item.add(map.get("rPlate5") != null?map.get("rPlate5").toString():"");
+                            break;
+                        }
+                    }
+                }
                 //项目管理专业版,需要显示任务分组和投入阶段
                 if (company.getPackageProject() == 1) {
                     item.add(map.get("groupName") != null? map.get("groupName").toString():"");

+ 3 - 1
fhKeeper/formulahousekeeper/management-platform-import/src/main/resources/mapper/ExpenseItemMapper.xml

@@ -7,6 +7,7 @@
         <id column="id" property="id" />
         <result column="expense_id" property="expenseId" />
         <result column="project_id" property="projectId" />
+        <result column="sub_project_id" property="subProjectId" />
         <result column="happen_date" property="happenDate" />
         <result column="invoice_type" property="invoiceType" />
         <result column="invoice_no" property="invoiceNo" />
@@ -22,6 +23,7 @@
         <id column="id" property="id" />
         <result column="expense_id" property="expenseId" />
         <result column="project_id" property="projectId" />
+        <result column="sub_project_id" property="subProjectId" />
         <result column="happen_date" property="happenDate" />
         <result column="invoice_type" property="invoiceType" />
         <result column="invoice_no" property="invoiceNo" />
@@ -37,7 +39,7 @@
 
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
-        id, expense_id, project_id, happen_date, invoice_type, invoice_no, tax_percent, tax_value, amount, remark, expense_type, pic
+        id, expense_id, project_id, sub_project_id, happen_date, invoice_type, invoice_no, tax_percent, tax_value, amount, remark, expense_type, pic
     </sql>
 
     <select id="getUserExpenseDetail" resultMap="UserBaseResultMap">

+ 5 - 0
fhKeeper/formulahousekeeper/management-platform-import/src/main/resources/mapper/ReportMapper.xml

@@ -67,6 +67,7 @@
         a.end_time  as endTime, d.name as subProjectName,d.code as subProjectCode,a.task_id as taskId, task.name as taskName, a.is_overtime as isOvertime,a.progress as progress,
         a.department_audit_state as departmentAuditState, a.stage, a.pic_str as picStr, multi_worktime as multiWorktime,a.is_dept_audit as isDeptAudit,a.group_audit_state as groupAuditState,task_group.incharger_id as inchargerId,a.project_audit_state as projectAuditState,a.audit_dept_managerid as deptAuditorName
         ,c.plate1 as plate1,c.plate2 as plate2,c.plate3 as plate3,c.plate4 as plate4,c.plate5 as plate5
+        ,a.plate1 as rPlate1,a.plate2 as rPlate2,a.plate3 as rPlate3,a.plate4 as rPlate4,a.plate5 as rPlate5
         , reject_reason as rejectReason, reject_username as rejectUsername, reject_userid as rejectUserid, degree_id as degree_id,report_extra_degree.name as degreeName,task_group.name as groupName,a.group_id as groupId,a.custom_data as customData
         ,u.name as projectAuditorName,u.corpwx_userid as projectAuditorCorpwxUserId, a.project_auditor_id as projectAuditorId, department.department_name as departmentName,dp2.department_name as buDepartmentName,department.department_id as departmentId, a.overtime_hours as overtimeHours, a.custom_text as customText,a.project_audit_time  as projectAuditTime,project_main.name as projectMainName
         FROM report AS a
@@ -119,6 +120,7 @@
         a.end_time  as endTime, d.name as subProjectName,d.code as subProjectCode,a.task_id as taskId, task.name as taskName, a.is_overtime as isOvertime,a.progress as progress,
         a.department_audit_state as departmentAuditState, a.stage, a.pic_str as picStr, multi_worktime as multiWorktime,a.is_dept_audit as isDeptAudit,a.group_audit_state as groupAuditState,task_group.incharger_id as inchargerId,a.project_audit_state as projectAuditState,a.audit_dept_managerid as deptAuditorName
         ,c.plate1 as plate1,c.plate2 as plate2,c.plate3 as plate3,c.plate4 as plate4,c.plate5 as plate5
+        ,a.plate1 as rPlate1,a.plate2 as rPlate2,a.plate3 as rPlate3,a.plate4 as rPlate4,a.plate5 as rPlate5
         , reject_reason as rejectReason, reject_username as rejectUsername, reject_userid as rejectUserid, degree_id as degree_id,report_extra_degree.name as degreeName,task_group.name as groupName,a.group_id as groupId,a.custom_data as customData
         ,u.name as projectAuditorName,u.corpwx_userid as projectAuditorCorpwxUserId, a.project_auditor_id as projectAuditorId, department.department_name as departmentName,dp2.department_name as buDepartmentName,department.department_id as departmentId, a.overtime_hours as overtimeHours, a.custom_text as customText,a.project_audit_time  as projectAuditTime,project_main.name as projectMainName,
         GROUP_CONCAT(rlog.operator_id,'@', rlog.operate_date,'@', rlog.msg SEPARATOR '❤') AS logMsg
@@ -226,6 +228,7 @@
         degree_id,report_extra_degree.name as degreeName,task_group.name as groupName,a.group_id as groupId,
         a.custom_data as customData
         ,c.plate1 as plate1,c.plate2 as plate2,c.plate3 as plate3,c.plate4 as plate4,c.plate5 as plate5
+        ,a.plate1 as rPlate1,a.plate2 as rPlate2,a.plate3 as rPlate3,a.plate4 as rPlate4,a.plate5 as rPlate5
         ,u.name as projectAuditorName,u.corpwx_userid as projectAuditorCorpwxUserId, a.project_auditor_id as projectAuditorId, department.department_name as
         departmentName,dp2.department_name as buDepartmentName,department.department_id as departmentId, a.overtime_hours as overtimeHours, a.custom_text as customText, a.project_audit_time as
         projectAuditTime,project_main.name as projectMainName
@@ -283,6 +286,7 @@
         degree_id,report_extra_degree.name as degreeName,task_group.name as groupName,a.group_id as groupId,
         a.custom_data as customData
         ,c.plate1 as plate1,c.plate2 as plate2,c.plate3 as plate3,c.plate4 as plate4,c.plate5 as plate5
+        ,a.plate1 as rPlate1,a.plate2 as rPlate2,a.plate3 as rPlate3,a.plate4 as rPlate4,a.plate5 as rPlate5
         ,u.name as projectAuditorName,u.corpwx_userid as projectAuditorCorpwxUserId, a.project_auditor_id as projectAuditorId, department.department_name as
         departmentName,dp2.department_name as buDepartmentName,department.department_id as departmentId, a.overtime_hours as overtimeHours, a.custom_text as customText, a.project_audit_time as
         projectAuditTime,project_main.name as projectMainName,
@@ -338,6 +342,7 @@
         a.end_time as endTime, d.name as subProjectName,a.task_id as taskId, task.name as taskName, a.is_overtime as isOvertime,a.progress as progress,
         a.department_audit_state as departmentAuditState,a.stage, a.pic_str as picStr, multi_worktime as multiWorktime,a.is_dept_audit as isDeptAudit,a.group_audit_state as groupAuditState,task_group.incharger_id as inchargerId,a.project_audit_state as projectAuditState,a.audit_dept_managerid as deptAuditorName
         ,c.plate1 as plate1,c.plate2 as plate2,c.plate3 as plate3,c.plate4 as plate4,c.plate5 as plate5
+        ,a.plate1 as rPlate1,a.plate2 as rPlate2,a.plate3 as rPlate3,a.plate4 as rPlate4,a.plate5 as rPlate5
         , reject_reason as rejectReason, reject_username as rejectUsername, reject_userid as rejectUserid, degree_id as degree_id,report_extra_degree.name as degreeName,task_group.name as groupName,a.group_id as groupId, a.custom_data as customData
         ,u.name as projectAuditorName,u.corpwx_userid as projectAuditorCorpwxUserId, a.project_auditor_id as projectAuditorId, department.department_name as departmentName,dp2.department_name as buDepartmentName,department.department_id as departmentId, a.overtime_hours as overtimeHours, a.custom_text as customText, a.project_audit_time as projectAuditTime,project_main.name as projectMainName
         FROM report AS a

二进制
fhKeeper/formulahousekeeper/management-platform-import/src/main/resources/upload/费用报销导入模板.xlsx


+ 12 - 13
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ExpenseSheetServiceImpl.java

@@ -445,6 +445,7 @@ public class ExpenseSheetServiceImpl extends ServiceImpl<ExpenseSheetMapper, Exp
                 List<User> userList = userMapper.selectList(new QueryWrapper<User>().eq("company_id", user.getCompanyId()));
                 List<Project> projectList = projectMapper.selectList(new QueryWrapper<Project>().eq("company_id", user.getCompanyId()));
                 List<SysRichFunction> functionList = sysFunctionMapper.getRoleFunctions(user.getRoleId(), "费用审核");
+                List<ExpenseMainType> expenseMainTypeList = expenseMainTypeService.list(new QueryWrapper<ExpenseMainType>().eq("company_id", user.getCompanyId()));
                 List<ExpenseType> expenseTypeList = expenseTypeMapper.selectList(new QueryWrapper<ExpenseType>().eq("company_id",user.getCompanyId()));
                 //由于第一行需要指明报销人列对应的标题
                 XSSFRow firstRow = sheet.getRow(2);
@@ -530,19 +531,17 @@ public class ExpenseSheetServiceImpl extends ServiceImpl<ExpenseSheetMapper, Exp
                 }
                 expenseSheet.setOperatorId(user.getId());
                 expenseSheet.setRemark(remarksCell.getStringCellValue());
-                switch (expenseTypeCell.getStringCellValue()) {
-                    case "一般":
-                    case "general":
-                        expenseSheet.setType(0);
-                        break;
-                    case "差旅":
-                    case "travel on business":
-                        expenseSheet.setType(1);
-                        break;
-                    case "外包":
-                    case "outsource":
-                        expenseSheet.setType(2);
-                        break;
+                if(StringUtils.isEmpty(expenseTypeCell.getStringCellValue())){
+                    msg.setError("请填写费用报销类型");
+                    return msg;
+                }
+                if(!expenseMainTypeList.stream().anyMatch(el->el.getName().equals(expenseTypeCell.getStringCellValue()))){
+                    msg.setError("当前费用类型["+expenseTypeCell.getStringCellValue()+"]不存在");
+                    return msg;
+                }
+                Optional<ExpenseMainType> any = expenseMainTypeList.stream().filter(el -> el.getName().equals(expenseTypeCell.getStringCellValue())).findAny();
+                if(any.isPresent()){
+                    expenseSheet.setType(any.get().getId());
                 }
                 expenseSheetMapper.insert(expenseSheet);
                 //前提需要指定第一二行为报销人数据 从第三行数据开始处理 报销单据详情

二进制
fhKeeper/formulahousekeeper/management-platform/src/main/resources/upload/费用报销导入模板.xlsx


+ 78 - 5
fhKeeper/formulahousekeeper/timesheet-import/src/views/expense/expense.vue

@@ -125,7 +125,7 @@
             @row-dblclick="dbclick">
             <el-table-column prop="projectName" :label="$t('subordinatetotheproject')" width="180">
               <template slot-scope="scope">
-                <el-select size="small" v-model="scope.row.projectId" :placeholder="$t('other.project')" style="width: 150px" filterable popper-class="projectSelectPopperClass">
+                <el-select size="small" v-model="scope.row.projectId" :placeholder="$t('other.project')" style="width: 150px" filterable popper-class="projectSelectPopperClass" @change="getSubProjectList(scope.row.projectId)">
                   <el-option v-for="(item, index) in projectList" :key="index" :label="item.projectName + item.projectCode" :value="item.id" @click="ok(item)">
                     <span style="float: left;color: #8492a6; font-size: 13px">{{ item.projectCode }}</span>
                     <span style="float: right;">{{ item.projectName }}</span>
@@ -133,6 +133,16 @@
                 </el-select>
               </template>
             </el-table-column>
+            <el-table-column prop="subProjectName" :label="'所属子项目'" width="180">
+              <template slot-scope="scope">
+                <el-select size="small" v-model="scope.row.subProjectId" :placeholder="$t('other.project')" style="width: 150px" filterable popper-class="projectSelectPopperClass">
+                  <el-option v-for="(item, index) in subProjectList" :key="index" :label="item.name + item.code" :value="item.id" @click="ok(item)">
+                    <span style="float: left;color: #8492a6; font-size: 13px">{{ item.code }}</span>
+                    <span style="float: right;">{{ item.name }}</span>
+                  </el-option>
+                </el-select>
+              </template>
+            </el-table-column>
             <el-table-column prop="happenDate" :label="$t('forthedate')" width="170px">
               <template slot-scope="scope">
                 <el-date-picker size="small" v-model="scope.row.happenDate" type="date" style=" width: 145px" value-format="yyyy-MM-dd" :placeholder="$t('optiondate')">
@@ -389,7 +399,7 @@
           <el-table :data="ParticularsList.invoiceList" border style="width: 100%">
             <el-table-column prop="projectId" :label="$t('other.project')" width="155">
                 <template slot-scope="scope">
-                  <el-select size="small" v-if="!flg" v-model="scope.row.projectId" :placeholder="$t('other.project')" style="width: 130px">
+                  <el-select size="small" v-if="!flg" v-model="scope.row.projectId" :key="selectIdx" :placeholder="$t('other.project')" style="width: 130px" @change="projectChange(scope.$index, scope.row.projectId)">
                     <el-option v-for="(item, index) in projectList" :key="index" :label="item.projectName + item.projectCode" :value="item.id" @click="ok(item)">
                       <span style="float: left;color: #8492a6; font-size: 13px">{{ item.projectCode }}</span>
                       <span style="float: right;margin-left: 20px">{{ item.projectName }}</span>
@@ -403,6 +413,21 @@
                   </div>
                 </template>
             </el-table-column>
+            <el-table-column prop="subProjectId" :label="'子项目'" width="155">
+                <template slot-scope="scope">
+                  <el-select size="small" v-if="!flg" v-model="scope.row.subProjectId" :placeholder="'子项目'" style="width: 130px">
+                    <el-option v-for="(item, index) in scope.row.subProjectList" :key="index" :label="item.name + item.code" :value="item.id" @click="ok(item)">
+                      <span style="float: left;color: #8492a6; font-size: 13px">{{ item.code }}</span>
+                      <span style="float: right;margin-left: 20px">{{ item.name }}</span>
+                    </el-option>
+                  </el-select>
+                  <div v-else>
+                    <div v-for="(item, index) in subProjectIdName" :key="index">
+                      <span v-if="item.id == scope.row.subProjectId">{{item.name}}</span>
+                    </div>
+                  </div>
+                </template>
+            </el-table-column>
             <el-table-column prop="happenDate" :label="$t('forthedate')" width="172">
               <template slot-scope="scope">
                 <el-date-picker size="small" v-if="!flg" v-model="scope.row.happenDate" type="date" style=" width: 145px" value-format="yyyy-MM-dd" :placeholder="$t('optiondate')">
@@ -655,7 +680,7 @@
             <el-table :data="ParticularsList.invoiceList" border style="width: 100%">
             <el-table-column prop="projectId" :label="$t('other.project')" width="155">
                 <template slot-scope="scope">
-                  <el-select size="small" v-if="!flg" v-model="scope.row.projectId" :placeholder="$t('other.project')" style="width: 130px">
+                  <el-select size="small" v-if="!flg" v-model="scope.row.projectId" :placeholder="$t('other.project')" style="width: 130px" @change="getSubProjectList(scope.row.projectId)">
                     <el-option v-for="(item, index) in projectList" :key="index" :label="item.projectName + item.projectCode" :value="item.id" @click="ok(item)">
                       <span style="float: left;color: #8492a6; font-size: 13px">{{ item.projectCode }}</span>
                       <span style="float: right;margin-left: 20px">{{ item.projectName }}</span>
@@ -669,6 +694,7 @@
                   </div>
                 </template>
             </el-table-column>
+            <el-table-column prop="subProjectName" :label="'子项目'" width="155"></el-table-column>
             <el-table-column prop="happenDate" :label="$t('forthedate')" width="172">
               <template slot-scope="scope">
                 <el-date-picker size="small" v-if="!flg" v-model="scope.row.happenDate" type="date" style=" width: 145px" value-format="yyyy-MM-dd" :placeholder="$t('optiondate')">
@@ -856,6 +882,7 @@ export default {
       displayTable: false,
       getLists: [],
       ProjectList: [], // 项目列表
+      subProjectList: [], // 子项目列表
       companyId: [], // 人员的id
       dialogVisible: false,
       code: null,
@@ -873,6 +900,7 @@ export default {
       dialog: false, // 单据查看展示
       ParticularsList: [],
       projectIdName: [], // 点击查看的项目名
+      subProjectIdName: [], // 点击查看的子项目名
       flg: false, // 是否禁用
       shuz: [this.$t('generalexpenses'), this.$t('travelexpensess'), this.$t('outsourcingcostshouldbereported')],
       ins: 0,
@@ -904,6 +932,8 @@ export default {
       // 详情弹出框
       detailDialog: false,
       detaExpenseMainTypeName: '',
+
+      selectIdx: 1
     };
   },
   computed: {
@@ -1487,11 +1517,11 @@ export default {
     },
     // 点击新增
     addxz() {
-      this.form = {happenDate: null  ,invoiceType:null,amount:null,invoiceNo:null,taxPercent:null,taxValue:null,remark:null,pic: null},
+      this.form = {happenDate: null  ,invoiceType:null,amount:null,invoiceNo:null,taxPercent:null,taxValue:null,remark:null,pic: null,subProjectList: null, subProjectId: null,subProjectName: null},
       this.invoiceList.push(this.form)
     },
     addNewInvoice(){
-      this.form = {happenDate: null,invoiceType:null,amount:null,invoiceNo:null,taxPercent:null,taxValue:null,remark:null,pic: null},
+      this.form = {happenDate: null,invoiceType:null,amount:null,invoiceNo:null,taxPercent:null,taxValue:null,remark:null,pic: null,subProjectList: null, subProjectId: null,subProjectName: null},
       this.ParticularsList.invoiceList.push(this.form)
       this.ParticularsList.ticketNum = this.ParticularsList.invoiceList.length
     },
@@ -1514,6 +1544,26 @@ export default {
                 type: "error"
             });
         });
+    },
+     //获取子项目列表
+    getSubProjectList(projectId) {
+        this.http.post( '/sub-project/list', {projectId:projectId,isReport:true},
+        res => {
+            if (res.code == "ok") {
+                this.subProjectList = res.data;
+            } else {
+                this.$message({
+                    message: res.msg,
+                    type: "error"
+                });
+            }
+        },
+        error => {
+            this.$message({
+                message: error,
+                type: "error"
+            });
+        });
     },
     //获取单据列表
     getList() {
@@ -2001,6 +2051,29 @@ export default {
         // newWindow.print();
         // newWindow.close();
         this.$print(this.$refs.printContent)
+      },
+      projectChange(i, id) {
+        console.log(i)
+        this.http.post( '/sub-project/list', {projectId: this.ParticularsList.invoiceList[i].projectId, isReport:true},
+        res => {
+            if (res.code == "ok") {
+                this.ParticularsList.invoiceList[i].subProjectId = '';
+                this.ParticularsList.invoiceList[i].subProjectList = res.data;
+                this.selectIdx++
+                this.$forceUpdate()
+            } else {
+                this.$message({
+                    message: res.msg,
+                    type: "error"
+                });
+            }
+        },
+        error => {
+            this.$message({
+                message: error,
+                type: "error"
+            });
+        });
       }
   },
   beforeDestroy() {

+ 4 - 1
fhKeeper/formulahousekeeper/timesheet_h5/src/utils/request.js

@@ -12,7 +12,10 @@ const service = axios.create({
 // request拦截器,在请求之前做一些处理
 service.interceptors.request.use(
     config => {
-        if(config.url != "/report/editReport" && config.url != "/project/editProject" && config.url != "/common/uploadFile" && config.url != "/project/editProject") {
+        if(config.url == "/report/record") {
+            console.log('执行力')
+            config.headers["Content-Type"] = "multipart/form-data";
+        } else if(config.url != "/report/editReport" && config.url != "/project/editProject" && config.url != "/common/uploadFile" && config.url != "/project/editProject") {
             config.data = qs.stringify(config.data);
             config.headers["Content-Type"] = "application/x-www-form-urlencoded; charset=UTF-8";
         } else {