浏览代码

费用报销支持项目经理审核模式

seyason 1 年之前
父节点
当前提交
51e1c8c8a5

+ 15 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ExpenseSheetController.java

@@ -82,12 +82,27 @@ public class ExpenseSheetController {
         return expenseSheetService.approve(id);
 
     }
+
+    @RequestMapping("/approveSingleProject")
+    public HttpRespMsg approveSingleProject(Integer id) {
+        return expenseSheetService.approveSingleProject(id);
+
+    }
+
+    @RequestMapping("/denySingleProject")
+    public HttpRespMsg denySingleProject(Integer id,String denyReason) {
+
+        return expenseSheetService.denySingleProject(id,denyReason);
+
+    }
+
     @RequestMapping("/deny")
     public HttpRespMsg deny(Integer id,String denyReason) {
 
         return expenseSheetService.deny(id,denyReason);
 
     }
+
     @RequestMapping("/importData")
     public HttpRespMsg importData(HttpServletRequest request,MultipartFile[] files){
         return expenseSheetService.importData(request,files);

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

@@ -421,6 +421,13 @@ public class ReportController {
                     stage = new String[projectId.length];
                 }
                 for (int i=0;i<projectId.length; i++) {
+                    if (id[i] != null && id[i] != -1) {
+                        Report oldReport = reportMapper.selectById(id[i]);
+                        //已通过和待审核状态的不需要处理
+                        if (oldReport.getState() == 0 || oldReport.getState() == 1) {
+                            continue;
+                        }
+                    }
                     if (stage[i] == null || stage[i].trim().length() == 0 || stage[i].equals("-")) {
                         HttpRespMsg msg = new HttpRespMsg();
                         msg.setError("请选择任务分组和阶段");

+ 10 - 8
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/ExpenseItem.java

@@ -15,7 +15,7 @@ import lombok.experimental.Accessors;
  * </p>
  *
  * @author Seyason
- * @since 2021-12-06
+ * @since 2023-07-20
  */
 @Data
 @EqualsAndHashCode(callSuper = false)
@@ -39,13 +39,6 @@ public class ExpenseItem extends Model<ExpenseItem> {
     @TableField("project_id")
     private Integer projectId;
 
-    /**
-     * 项目名称
-     */
-    @TableField(exist = false)
-    private  String projectName;
-
-
     /**
      * 费用日期
      */
@@ -100,6 +93,15 @@ public class ExpenseItem extends Model<ExpenseItem> {
     @TableField("pic")
     private String pic;
 
+    /**
+     * 项目经理审核模式下需要:0-审核通过,1-待审核,2-驳回,3-已撤回
+     */
+    @TableField("status")
+    private Integer status;
+
+
+    @TableField(exist = false)
+    private String projectName;
 
     @Override
     protected Serializable pkVal() {

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

@@ -34,4 +34,8 @@ public interface ExpenseSheetService extends IService<ExpenseSheet> {
     HttpRespMsg importData(HttpServletRequest request, MultipartFile[] files);
 
     HttpRespMsg exportList(ExpenseSheet sheet, String startDate, String endDate);
+
+    HttpRespMsg approveSingleProject(Integer id);
+
+    HttpRespMsg denySingleProject(Integer id, String denyReason);
 }

+ 179 - 10
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ExpenseSheetServiceImpl.java

@@ -92,19 +92,33 @@ public class ExpenseSheetServiceImpl extends ServiceImpl<ExpenseSheetMapper, Exp
     @Resource
     private ProjectCurrentcostMapper projectCurrentcostMapper;
 
+    @Resource
+    private ExpenseAuditSettingMapper expenseAuditSettingMapper;
+
     @Override
     public HttpRespMsg add(ExpenseSheet sheet, String items, String userId) {
         HttpRespMsg msg = new HttpRespMsg();
         User user = userMapper.selectById(userId);
+        ExpenseAuditSetting auditSetting = expenseAuditSettingMapper.selectById(user.getCompanyId());
+
+
         List<SysRichFunction> functionDeptList = sysFunctionMapper.getRoleFunctions(user.getRoleId(), "费用审核");
         boolean isAuditor = functionDeptList.size() > 0;
         boolean isNew = false;
         if (sheet.getId() == null) {
-            if (isAuditor) {
-                sheet.setStatus(0);
-            } else {
+            if (auditSetting == null || auditSetting.getAuditType() == 0) {
+                //默认系统中设置的有审核权限的人审核
+                if (isAuditor) {
+                    sheet.setStatus(0);
+                } else {
+                    sheet.setStatus(1);
+                }
+            } else if (auditSetting.getAuditType() == 1) {
+                //项目经理审核,默认为待审核状态
                 sheet.setStatus(1);
             }
+
+
             isNew = true;
             //检查code不能重复
             Integer num = expenseSheetMapper.selectCount(new QueryWrapper<ExpenseSheet>().eq("company_id", user.getCompanyId()).eq("code", sheet.getCode()));
@@ -116,9 +130,15 @@ public class ExpenseSheetServiceImpl extends ServiceImpl<ExpenseSheetMapper, Exp
         } else {
             //如果是驳回状态,改成待审核,否则不变
             if (sheet.getStatus() == 2) {
-                if (isAuditor) {
-                    sheet.setStatus(0);
-                } else {
+                if (auditSetting == null || auditSetting.getAuditType() == 0) {
+                    //默认系统中设置的有审核权限的人审核
+                    if (isAuditor) {
+                        sheet.setStatus(0);
+                    } else {
+                        sheet.setStatus(1);
+                    }
+                } else if (auditSetting.getAuditType() == 1) {
+                    //项目经理审核,默认为待审核状态
                     sheet.setStatus(1);
                 }
             }
@@ -173,7 +193,8 @@ public class ExpenseSheetServiceImpl extends ServiceImpl<ExpenseSheetMapper, Exp
 
         if (isNew) {
             expenseSheetMapper.insert(sheet);
-            if (!isAuditor) {
+            //常规审核
+            if ((auditSetting == null || auditSetting.getAuditType() == 0) && !isAuditor) {
                 WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", user.getCompanyId()));
                 if(wxCorpInfo!=null){
                     //获取具有费用报销审核权限的人员
@@ -242,10 +263,82 @@ public class ExpenseSheetServiceImpl extends ServiceImpl<ExpenseSheetMapper, Exp
 
         //对于修改的情况,要删除之前的
         if (!isNew) {
-            expenseItemService.remove(new QueryWrapper<ExpenseItem>().eq("expense_id", sheet.getId()));
+            if (auditSetting.getAuditType() == null || auditSetting.getAuditType() == 0) {
+                expenseItemService.remove(new QueryWrapper<ExpenseItem>().eq("expense_id", sheet.getId()));
+                expenseItemService.saveBatch(itemList);
+            } else {
+                //已通过不能删除
+                QueryWrapper<ExpenseItem> queryWrapper = new QueryWrapper<ExpenseItem>().eq("expense_id", sheet.getId());
+                queryWrapper.eq("status", 0);
+                List<ExpenseItem> passList = expenseItemService.list(queryWrapper);
+                //去掉审核通过的
+                itemList = itemList.stream().filter(item->!passList.stream().anyMatch(p->p.getId().equals(item.getId()))).collect(Collectors.toList());
+                //设置为待审核状态
+                System.out.println("设置状态为待审核"+itemList.size());
+                itemList.forEach(item->item.setStatus(1));
+                expenseItemService.remove(new QueryWrapper<ExpenseItem>().eq("expense_id", sheet.getId()).ne("status", 0));
+                expenseItemService.saveOrUpdateBatch(itemList);
+            }
+        } else {
+            //新增时都是待审核
+            itemList.forEach(item->item.setStatus(1));
+            expenseItemService.saveBatch(itemList);
         }
-        expenseItemService.saveBatch(itemList);
 
+        if (isNew && auditSetting.getAuditType() != null && auditSetting.getAuditType() == 1) {
+            //发送给项目经理审核
+            List<Integer> collect = itemList.stream().map(ExpenseItem::getProjectId).collect(Collectors.toList());
+            if (collect.size() > 0) {
+                List<String> inchargerIds = projectMapper.selectList(new QueryWrapper<Project>().select("incharger_id").in("id", collect)).stream().map(Project::getInchargerId).distinct().collect(Collectors.toList());
+                List<User> targetUserList = userMapper.selectList(new QueryWrapper<User>().in("id", inchargerIds));
+                WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", user.getCompanyId()));
+                if (wxCorpInfo != null) {
+                    String corpUserString = targetUserList.stream().map(tl -> tl.getCorpwxUserid()).collect(Collectors.joining("|"));
+                    User targetUser = userMapper.selectById(sheet.getOwnerId());
+                    ExpenseMainType mainType = expenseMainTypeService.getById(sheet.getType());
+                    //推送到企业微信
+                    JSONObject json=new JSONObject();
+                    JSONArray dataJson=new JSONArray();
+                    JSONObject jsonObj=new JSONObject();
+                    jsonObj.put("key", "报销人");
+                    jsonObj.put("value",("$userName="+targetUser.getCorpwxUserid()+"$"));
+                    JSONObject jsonObj1=new JSONObject();
+                    jsonObj1.put("key", "填报日期");
+                    jsonObj1.put("value",sheet.getCreateDate());
+                    JSONObject jsonObj2=new JSONObject();
+                    jsonObj2.put("key", "票据类型");
+                    jsonObj2.put("value",mainType.getName());
+                    JSONObject jsonObj3=new JSONObject();
+                    jsonObj3.put("key", "金额");
+                    jsonObj3.put("value",sheet.getTotalAmount());
+                    JSONObject jsonObj4=new JSONObject();
+                    jsonObj4.put("key", "备注");
+                    jsonObj4.put("value",sheet.getRemark()==null?"":sheet.getRemark());
+                    dataJson.add(jsonObj);
+                    dataJson.add(jsonObj1);
+                    dataJson.add(jsonObj2);
+                    dataJson.add(jsonObj3);
+                    dataJson.add(jsonObj4);
+                    json.put("template_id","tty9TkCAAALUiWvjdoDg_PZf48gwucZA");
+                    json.put("url","https://open.weixin.qq.com/connect/oauth2/authorize?appid=ww4e237fd6abb635af&redirect_uri=http://worktime.ttkuaiban.com/api/corpWXAuth&response_type=code&scope=snsapi_base&state=expense#wechat_redirect");
+                    json.put("content_item",dataJson);
+                    wxCorpInfoService.sendWXCorpTemplateMsg(wxCorpInfo,corpUserString, json);
+                }
+
+                List<Information> informationList=new ArrayList<>();
+                for (User item : targetUserList) {
+                    Information information=new Information();
+                    information.setUserId(item.getId());
+                    information.setTime(LocalDateTime.now());
+                    information.setMsg("费用报销待审核");
+                    information.setType(3);
+                    information.setContent(sheet.getCreateDate()+"");
+                    informationList.add(information);
+                }
+                informationService.saveBatch(informationList);
+            }
+
+        }
         return msg;
     }
 
@@ -308,7 +401,6 @@ public class ExpenseSheetServiceImpl extends ServiceImpl<ExpenseSheetMapper, Exp
         if (list.size() > 0) {
             String code = list.get(0).getCode();
             code = code.substring(format.length(), code.length());
-            System.out.println("code====="+code);
             if (code.length() > 0) {
                 start = Integer.parseInt(code) + 1;
             }
@@ -402,6 +494,28 @@ public class ExpenseSheetServiceImpl extends ServiceImpl<ExpenseSheetMapper, Exp
 
     }
 
+    private void sendSingleAuditResult(WxCorpInfo wxCorpInfo, User auditor, ExpenseItem item, String ownerId, LocalDate createDate,  String denyReason) {
+        //推送到企业微信
+        StringBuilder stringBuilder = new StringBuilder();
+        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("M月d日");
+        stringBuilder.append("$userName="+auditor.getCorpwxUserid()+"$")
+                .append(item.getStatus() == 0?"通过":"驳回")
+                .append("了您");
+        if (createDate != null) {
+            stringBuilder.append("于").append(dateTimeFormatter.format(createDate));
+        }
+        stringBuilder.append("的费用报销申请。");
+        if (item.getStatus() == 2 && !StringUtils.isEmpty(denyReason)) {
+            //驳回加原因
+            stringBuilder.append("原因: ").append(denyReason);
+        }
+
+        User owner = userMapper.selectById(ownerId);
+        wxCorpInfoService.sendWXCorpMsg(wxCorpInfo,owner.getCorpwxUserid(), stringBuilder.toString(), "expense",
+                item.getStatus() == 0?WxCorpInfoServiceImpl.TEXT_CARD_MSG_EXPENSE_AGREE:WxCorpInfoServiceImpl.TEXT_CARD_MSG_EXPENSE_DENY);
+
+    }
+
 
     private void saveNotifyToApplier(ExpenseSheet sheet, User auditor) {
         DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("M月d日");
@@ -840,4 +954,59 @@ public class ExpenseSheetServiceImpl extends ServiceImpl<ExpenseSheetMapper, Exp
 //        msg.data = resp;
         return msg;
     }
+
+    @Override
+    public HttpRespMsg approveSingleProject(Integer itemId) {
+        String token = request.getHeader("TOKEN");
+        User user = userMapper.selectById(token);
+        ExpenseItem item = new ExpenseItem();
+        item.setId(itemId);
+        item.setStatus(0);
+        expenseItemMapper.updateById(item);
+        ExpenseItem expenseItem = expenseItemMapper.selectById(itemId);
+        //查询单据下的全部费用项目状态
+        int count = expenseItemMapper.selectCount(new QueryWrapper<ExpenseItem>().eq("expense_id", item.getExpenseId()).ne("status", 0));
+        if (count == 0) {
+            ExpenseSheet sheet = new ExpenseSheet();
+            sheet.setId(expenseItem.getExpenseId());
+            sheet.setStatus(0);
+            expenseSheetMapper.updateById(sheet);
+        }
+
+        ExpenseSheet sheet = expenseSheetMapper.selectById(expenseItem.getExpenseId());
+        WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", user.getCompanyId()));
+        if (wxCorpInfo != null) {
+            sendSingleAuditResult(wxCorpInfo, user, expenseItem, sheet.getOwnerId(), sheet.getCreateDate(), null);
+        }
+        saveNotifyToApplier(sheet, user);
+
+        return new HttpRespMsg();
+    }
+
+    @Override
+    public HttpRespMsg denySingleProject(Integer itemId, String denyReason) {
+        String token = request.getHeader("TOKEN");
+        User user = userMapper.selectById(token);
+        ExpenseItem item = new ExpenseItem();
+        item.setId(itemId);
+        item.setStatus(2);
+        expenseItemMapper.updateById(item);
+        ExpenseItem expenseItem = expenseItemMapper.selectById(itemId);
+        //查询单据下的全部费用项目状态
+        int count = expenseItemMapper.selectCount(new QueryWrapper<ExpenseItem>().eq("expense_id", item.getExpenseId()).ne("status", 2));
+        if (count == 0) {
+            ExpenseSheet sheet = new ExpenseSheet();
+            sheet.setId(expenseItem.getExpenseId());
+            sheet.setStatus(2);
+            expenseSheetMapper.updateById(sheet);
+        }
+
+        ExpenseSheet sheet = expenseSheetMapper.selectById(expenseItem.getExpenseId());
+        WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", user.getCompanyId()));
+        if (wxCorpInfo != null) {
+            sendSingleAuditResult(wxCorpInfo, user, expenseItem, sheet.getOwnerId(), sheet.getCreateDate(), denyReason);
+        }
+        saveNotifyToApplier(sheet, user);
+        return new HttpRespMsg();
+    }
 }

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

@@ -641,7 +641,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                 if (company.getPackageProject() == 1) {
                     //如果是按照任务分组负责人审核,取参与的分组
                     if (reportAuditType == 1 || reportAuditType == 2){
-                        List<GroupParticipator> groupParticipatorList = groupParticipatorMapper.selectList(new QueryWrapper<GroupParticipator>());
+                        List<GroupParticipator> groupParticipatorList = groupParticipatorMapper.selectList(new QueryWrapper<GroupParticipator>().eq("user_id", r.getCreatorId()));
                         if (groupParticipatorList.size() > 0) {
                             List<Integer> groupIds = groupParticipatorList.stream().map(GroupParticipator::getGroupId).collect(Collectors.toList());
                             List<TaskGroup> findGroups = taskGroups.stream().filter(tg->groupIds.contains(tg.getId()) || userId.equals(tg.getInchargerId())).collect(Collectors.toList());

+ 11 - 12
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ExpenseItemMapper.xml

@@ -16,8 +16,8 @@
         <result column="remark" property="remark" />
         <result column="expense_type" property="expenseType" />
         <result column="pic" property="pic" />
+        <result column="status" property="status" />
     </resultMap>
-
     <resultMap id="UserBaseResultMap" type="com.management.platform.entity.vo.ExpenseItemVO">
         <id column="id" property="id" />
         <result column="expense_id" property="expenseId" />
@@ -31,21 +31,20 @@
         <result column="remark" property="remark" />
         <result column="expense_type" property="expenseType" />
         <result column="pic" property="pic" />
+        <result column="status" property="status" />
         <result column="username" property="username" />
         <result column="department_name" property="departmentName" />
     </resultMap>
-
     <!-- 通用查询结果列 -->
     <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, happen_date, invoice_type, invoice_no, tax_percent, tax_value, amount, remark, expense_type, pic, status
     </sql>
-
     <select id="getUserExpenseDetail" resultMap="UserBaseResultMap">
-        select a.id, a.expense_id, a.project_id, a.happen_date, a.invoice_type, a.tax_percent, a.tax_value, a.amount, a.remark, a.expense_type, a.pic,
-        user.name as username, department.department_name
+        select a.id, a.expense_id, a.project_id, a.happen_date, a.invoice_type, a.tax_percent, a.tax_value, a.amount, a.remark, a.expense_type, a.pic,a.status,
+               user.name as username, department.department_name
         from expense_item a left join expense_sheet b on a.expense_id = b.id
-        left join user on user.id = b.owner_id
-        left join department on department.department_id = user.department_id
+                            left join user on user.id = b.owner_id
+                            left join department on department.department_id = user.department_id
         where a.project_id = #{projectId} order by a.happen_date desc
     </select>
 
@@ -64,10 +63,10 @@
     <select id="selectSumAmountByProjectAndType" resultType="java.lang.Double">
         select IFNULL(sum(expense_item.amount),0)
         from expense_item
-        left join expense_sheet on expense_sheet.id = expense_item.expense_id
+                 left join expense_sheet on expense_sheet.id = expense_item.expense_id
         where expense_item.project_id = #{projectId}
-        and expense_item.amount is not null
-        and expense_sheet.status &lt;= 1
-        and expense_sheet.type = #{type}
+          and expense_item.amount is not null
+          and expense_sheet.status &lt;= 1
+          and expense_sheet.type = #{type}
     </select>
 </mapper>

+ 130 - 25
fhKeeper/formulahousekeeper/timesheet/src/views/expense/expense.vue

@@ -252,6 +252,7 @@
               <el-form-item v-if="currentClick == '2-1'">
                 <el-button @click="exportDocument()" size="small">单据导出</el-button>
               </el-form-item>
+              <!-- <span>审核模式:{{ auditTypeItem.auditType }}</span> -->
             </div>
           </el-form>
         </div>
@@ -333,7 +334,7 @@
       </div>
   </div>
     <!-- 我的单据报销展示 -->
-      <el-dialog :title="$t('detailsofReimbursementvoucher')" :visible.sync="dialog" width="1000px">
+      <el-dialog title="报销凭证详情" :visible.sync="dialog" width="1000px">
         <!-- 内容主体 -->
         <div class="informant"><!--  报销人 -->
           <el-form :model="ParticularsList" label-width="80px">
@@ -385,6 +386,13 @@
             <span class="newInvoice" @click="addNewInvoice"> <i class="el-icon-circle-plus-outline"></i> {{ $t('newinvoice') }}</span>
           </div>
           <el-table :data="ParticularsList.invoiceList" border style="width: 100%">
+            <el-table-column prop="status" label="审核状态" width="172" v-if="auditTypeItem.auditType == 1">
+              <template slot-scope="scope">
+                  <span v-if="scope.row.status == 1" class="waiting">{{statusTxt[scope.row.status]}}</span>
+                  <span v-if="scope.row.status == 2" class="rejected">{{statusTxt[scope.row.status]}}</span>
+                  <span v-if="scope.row.status == 0 || scope.row.status == 3" >{{statusTxt[scope.row.status]}}</span>
+                </template>
+            </el-table-column>
             <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">
@@ -483,6 +491,11 @@
                 <el-button  type="default" size="mini" style="display: inline-block;margin-left:0;margin-top: 3px" @click="delec(scope.$index)">{{ $t('btn.delete') }}</el-button>
               </template>
             </el-table-column>
+            <el-table-column prop="status" label="审核" width="172" v-if="auditTypeItem.auditType == 1 && showSingleAudit" fixed="right">
+              <template slot-scope="scope">
+                  <el-button @click="approveSingle(scope.row)">通过</el-button><el-button @click="denySingle(scope.row)">驳回</el-button>
+                </template>
+            </el-table-column>
           </el-table>
         </div>
         <!-- <viewer :images="imgs">
@@ -651,7 +664,15 @@
               </div>
             </div>
             <el-table :data="ParticularsList.invoiceList" border style="width: 100%">
+
             <el-table-column prop="projectId" :label="$t('other.project')" width="155">
+              <el-table-column prop="status" label="审核状态" width="172" v-if="auditTypeItem.auditType == 1">
+                <template slot-scope="scope">
+                    <span v-if="scope.row.status == 1" class="waiting">{{statusTxt[scope.row.status]}}</span>
+                    <span v-if="scope.row.status == 2" class="rejected">{{statusTxt[scope.row.status]}}</span>
+                    <span v-if="scope.row.status == 0 || scope.row.status == 3" >{{statusTxt[scope.row.status]}}</span>
+                  </template>
+              </el-table-column>
                 <template slot-scope="scope">
                   <el-select size="small" v-if="!flg" v-model="scope.row.projectId" :placeholder="$t('other.project')" style="width: 130px">
                     <el-option v-for="(item, index) in projectList" :key="index" :label="item.projectName + item.projectCode" :value="item.id" @click="ok(item)">
@@ -819,6 +840,8 @@ export default {
   props: {},
   data() {
     return {
+      showSingleAudit: false,
+      auditTypeItem: {auditType:0},
       queryExpenseMainType: null,
       denyReasonDialog: false,
       denyForm:{
@@ -934,6 +957,7 @@ export default {
     this.getExpensMainTypes();
     this.getExpList();
     this.getBasecostItemList();
+    this.getAuditType();
   },
   filters: {
       numberToCurrency(value) {
@@ -1205,36 +1229,97 @@ export default {
             inpu.value = parseFloat(inpu.value);
         }
     },
+    approveSingle(item) {
+      this.http.post('/expense-sheet/approveSingleProject', {id:item.id
+          },
+          res => {
+              if (res.code == "ok") {
+                  this.getList();
+                  this.showSingleAudit = false;
+                  this.dialog = false;
+              } else {
+                  this.$message({
+                  message: res.msg,
+                  type: "error"
+                  });
+              }
+          },
+          error => {
+              this.$message({
+                  message: error,
+                  type: "error"
+              });
+          });
+    },
     approve(item) {
-      //审核通过
-      this.http.post('/expense-sheet/approve', {id:item.id
-        },
-        res => {
-            if (res.code == "ok") {
-                this.getList();
-            } else {
-                this.$message({
-                message: res.msg,
-                type: "error"
-                });
-            }
-        },
-        error => {
-            this.$message({
-                message: error,
-                type: "error"
-            });
-        });
+      if (this.auditTypeItem.auditType == 0) {
+        //默认模式,按有审核权限的人直接审核
+        this.showSingleAudit = false;
+        //审核通过
+        this.http.post('/expense-sheet/approve', {id:item.id
+          },
+          res => {
+              if (res.code == "ok") {
+                  this.getList();
+              } else {
+                  this.$message({
+                  message: res.msg,
+                  type: "error"
+                  });
+              }
+          },
+          error => {
+              this.$message({
+                  message: error,
+                  type: "error"
+              });
+          });
+      } else {
+        //项目经理按项目逐条审核
+        this.showSingleAudit = true;
+        this.downloadByA(item);
+      }
+      
+    },
+
+    denySingle(item) {
+        //项目经理审核模式
+        this.http.post('/expense-sheet/denySingleProject', {
+            id: item.id
+          },
+          res => {
+              if (res.code == "ok") {
+                  this.dialog = false;
+                  this.showSingleAudit = false;
+                  this.getList();
+              } else {
+                  this.$message({
+                    message: res.msg,
+                    type: "error"
+                  });
+              }
+          },
+          error => {
+              this.$message({
+                  message: error,
+                  type: "error"
+              });
+          });
     },
+
     denyReason(item){
-      this.denyForm.id = item.id
-      this.denyForm.reason = ''
-      // this.denyReasonDialog = true
-      this.deny()
+      if (this.auditTypeItem.auditType == 0) {
+          this.denyForm.id = item.id
+          this.denyForm.reason = ''
+          // this.denyReasonDialog = true
+          this.deny()
+      } else {
+          this.downloadByA(item);
+          this.showSingleAudit = true;
+      }
     },
     deny() {
       //审核驳回
-
       this.http.post('/expense-sheet/deny', {
           id: this.denyForm.id,
           denyReason: this.denyForm.reason
@@ -1513,6 +1598,26 @@ export default {
             });
         });
     },
+    //获取审核模式
+    getAuditType() {
+      this.http.post('/expense-audit-setting/get', {},
+        res => {
+            if (res.code == "ok") {
+                this.auditTypeItem = res.data;
+            } else {
+                this.$message({
+                    message: res.msg,
+                    type: "error"
+                });
+            }
+        },
+        error => {
+            this.$message({
+                message: error,
+                type: "error"
+            });
+        });
+    },
     //获取单据列表
     getList() {
       // console.log(this.date)