diff --git a/ruoyi-admin/src/main/java/com/ruoyi/financial/controller/FinacialExpenseController.java b/ruoyi-admin/src/main/java/com/ruoyi/financial/controller/FinacialExpenseController.java index 4b37c6ef..a38da96a 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/financial/controller/FinacialExpenseController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/financial/controller/FinacialExpenseController.java @@ -1,15 +1,23 @@ package com.ruoyi.financial.controller; +import java.util.HashMap; import java.util.List; + +import com.ruoyi.common.core.redis.RedisCache; +import com.ruoyi.process.general.service.IProcessService; +import com.ruoyi.remind.service.RemindService; +import com.ruoyi.financial.domain.VO.FinacialExpenseVo; +import com.ruoyi.system.service.*; +import org.activiti.engine.RuntimeService; +import org.activiti.engine.TaskService; +import org.activiti.engine.runtime.ProcessInstance; +import org.activiti.engine.task.Task; +import org.apache.commons.lang3.BooleanUtils; import org.apache.shiro.authz.annotation.RequiresPermissions; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.ModelMap; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.*; import com.ruoyi.common.annotation.Log; import com.ruoyi.common.enums.BusinessType; import com.ruoyi.financial.domain.FinacialExpense; @@ -19,6 +27,9 @@ import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.common.core.page.TableDataInfo; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpSession; + /** * 报销管理Controller * @@ -34,6 +45,28 @@ public class FinacialExpenseController extends BaseController @Autowired private IFinacialExpenseService finacialExpenseService; + @Autowired + private RedisCache redisCache; + + @Autowired + private ISysDictTypeService sysDictTypeService; + @Autowired + private RemindService remindService; + + @Autowired + private ISysRoleService roleService; + + @Autowired + private TaskService taskService; + + @Autowired + private RuntimeService runtimeService; + @Autowired + private ISysUserService sysUserService; + + @Autowired + private IProcessService processService; + @RequiresPermissions("financial:expense:view") @GetMapping() public String expense() @@ -57,16 +90,16 @@ public class FinacialExpenseController extends BaseController /** * 导出报销管理列表 */ - @RequiresPermissions("financial:expense:export") - @Log(title = "报销管理", businessType = BusinessType.EXPORT) - @PostMapping("/export") - @ResponseBody - public AjaxResult export(FinacialExpense finacialExpense) - { - List list = finacialExpenseService.selectFinacialExpenseList(finacialExpense); - ExcelUtil util = new ExcelUtil(FinacialExpense.class); - return util.exportExcel(list, "报销管理数据"); - } +// @RequiresPermissions("financial:expense:export") +// @Log(title = "报销管理", businessType = BusinessType.EXPORT) +// @PostMapping("/export") +// @ResponseBody +// public AjaxResult export(FinacialExpense finacialExpense) +// { +// List list = finacialExpenseService.selectFinacialExpenseList(finacialExpense); +// ExcelUtil util = new ExcelUtil(FinacialExpense.class); +// return util.exportExcel(list, "报销管理数据"); +// } /** * 新增报销管理 @@ -123,12 +156,87 @@ public class FinacialExpenseController extends BaseController { return toAjax(finacialExpenseService.deleteFinacialExpenseByIds(ids)); } + @GetMapping("/showVerifyDialog/{taskId}") + public String showVerifyDialog(@PathVariable("taskId") String taskId, ModelMap mmap) { + Task task = taskService.createTaskQuery().taskId(taskId).singleResult(); + String processInstanceId = task.getProcessInstanceId(); + ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).singleResult(); + FinacialExpense finacialExpense = finacialExpenseService.selectFinacialExpenseById(new Long(processInstance.getBusinessKey())); + mmap.put("formData", finacialExpense); + mmap.put("taskId", taskId); + String verifyName = task.getTaskDefinitionKey().substring(0, 1).toUpperCase() + task.getTaskDefinitionKey().substring(1); + return prefix + "/task" + verifyName; + } + @ModelAttribute("/preloadObj") + public FinacialExpense getObj(@RequestParam(value = "expenseId", required = false) Long expenseId, HttpSession session) { + if (expenseId != null) { + return finacialExpenseService.selectFinacialExpenseById(expenseId); + } + return new FinacialExpense(); + } + /** + * 完成任务 + * + * @return + */ + @RequestMapping(value = "/complete/{taskId}", method = {RequestMethod.POST, RequestMethod.GET}) + @ResponseBody + public AjaxResult complete(@PathVariable("taskId") String taskId, @RequestParam(value = "saveEntity", required = false) String saveEntity, + @ModelAttribute("preloadObj") FinacialExpenseVo finacialExpenseVo, HttpServletRequest request) { + boolean saveEntityBoolean = BooleanUtils.toBoolean(saveEntity); + if (saveEntityBoolean){ + finacialExpenseService.updateFinacialExpense(finacialExpenseVo); + } + String instanceId = finacialExpenseVo.getInstanceId(); + String instanceType = finacialExpenseVo.getInstanceType(); + boolean approvedFlag = processService.complete(taskId, instanceId, finacialExpenseVo.getApplyTitle(), + finacialExpenseVo.getExpenseCode(), + "expense", new HashMap(), request); + if(!approvedFlag){ + // 审核状态-审核拒绝 + finacialExpenseVo.setAuditStatus("2"); + } + // 如果任务已结束更新业务表状态 方法中传入的值为原来的instanceId,只是做了调整 + boolean processIsFinish = processService.judgeProcessIsFinish(instanceId); + if (processIsFinish) { + // 审核通过 + finacialExpenseVo.setAuditStatus("1"); + finacialExpenseVo.setFinanceAuditStatus("0"); + finacialExpenseVo.setManagerAuditStatus("1"); + // 提交 + if("submit".equals(instanceType)){ + // 使用状态-是 + finacialExpenseVo.setUseStatus("1"); + //总经理审核完毕为转入财务审核,如果是总经理审核的话,财务审核状态为0 + if(finacialExpenseVo.getTaskName().contains("总经理")){ + finacialExpenseVo.setManagerAuditStatus("1"); + finacialExpenseService.updateFinacialExpense(finacialExpenseVo); + } + } + // 作废 + else if("cancel".equals(instanceType)){ + // 使用状态-已作废 + finacialExpenseVo.setUseStatus("2"); + } + // 恢复 + else if("restore".equals(instanceType)){ + // 使用状态-是 + finacialExpenseVo.setUseStatus("1"); + } + } + finacialExpenseService.updateFinacialExpense(finacialExpenseVo); + // 驳回申请后继续申请,可能修改表单 + if (saveEntityBoolean) { + finacialExpenseService.updateFinacialExpense(finacialExpenseVo); + } + return success("任务已完成"); + } /** - * 作废报销管理 + * 作废报销单 */ - @RequiresPermissions("financial:expense:cancel") - @Log(title = "报销管理", businessType = BusinessType.CANCEL) + @RequiresPermissions("system:baseExpense:cancel") + @Log(title = "报销单", businessType = BusinessType.CANCEL) @GetMapping( "/cancel/{id}") @ResponseBody public AjaxResult cancel(@PathVariable("id") Long id){ @@ -136,10 +244,10 @@ public class FinacialExpenseController extends BaseController } /** - * 恢复报销管理 + * 恢复报销单 */ - @RequiresPermissions("financial:expense:restore") - @Log(title = "报销管理", businessType = BusinessType.RESTORE) + @RequiresPermissions("system:baseExpense:restore") + @Log(title = "报销单", businessType = BusinessType.RESTORE) @GetMapping( "/restore/{id}") @ResponseBody public AjaxResult restore(@PathVariable("id")Long id) @@ -148,4 +256,10 @@ public class FinacialExpenseController extends BaseController } + @RequestMapping("/getExpenseUser") + @ResponseBody + public AjaxResult getExpenseCode() throws Exception { + return AjaxResult.success(sysUserService.selectUserAll()); + } + } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/financial/domain/FinacialExpense.java b/ruoyi-admin/src/main/java/com/ruoyi/financial/domain/FinacialExpense.java index 105f366d..424c9305 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/financial/domain/FinacialExpense.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/financial/domain/FinacialExpense.java @@ -1,10 +1,15 @@ package com.ruoyi.financial.domain; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.ruoyi.financial.service.impl.FinacialExpenseChild; import org.apache.commons.lang3.builder.ToStringBuilder; import org.apache.commons.lang3.builder.ToStringStyle; import com.ruoyi.common.annotation.Excel; import com.ruoyi.common.core.domain.BaseEntity; +import java.util.Date; +import java.util.List; + /** * 报销管理对象 finacial_expense * @@ -81,7 +86,95 @@ public class FinacialExpense extends BaseEntity /** 删除标志 */ private String delFlag; - public void setExpenseId(Long expenseId) + /** 流程实例ID */ + private String instanceId; + + /** 流程实例类型 */ + private String instanceType; + + /** 提交流程实例ID */ + private String submitInstanceId; + + /** 作废流程实例ID */ + private String cancelInstanceId; + + /** 恢复流程实例ID */ + private String restoreInstanceId; + + /** 申请人 */ + private String applyTitle; + + private List finacialExpenseChildList; + + public List getFinacialExpenseChildList() { + return finacialExpenseChildList; + } + + public void setFinacialExpenseChildList(List finacialExpenseChildList) { + this.finacialExpenseChildList = finacialExpenseChildList; + } + + /** 申请时间 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date applyTime; + + public String getInstanceId() { + return instanceId; + } + + public void setInstanceId(String instanceId) { + this.instanceId = instanceId; + } + + public String getInstanceType() { + return instanceType; + } + + public void setInstanceType(String instanceType) { + this.instanceType = instanceType; + } + + public String getSubmitInstanceId() { + return submitInstanceId; + } + + public void setSubmitInstanceId(String submitInstanceId) { + this.submitInstanceId = submitInstanceId; + } + + public String getCancelInstanceId() { + return cancelInstanceId; + } + + public void setCancelInstanceId(String cancelInstanceId) { + this.cancelInstanceId = cancelInstanceId; + } + + public String getRestoreInstanceId() { + return restoreInstanceId; + } + + public void setRestoreInstanceId(String restoreInstanceId) { + this.restoreInstanceId = restoreInstanceId; + } + + public String getApplyTitle() { + return applyTitle; + } + + public void setApplyTitle(String applyTitle) { + this.applyTitle = applyTitle; + } + + public Date getApplyTime() { + return applyTime; + } + + public void setApplyTime(Date applyTime) { + this.applyTime = applyTime; + } + + public void setExpenseId(Long expenseId) { this.expenseId = expenseId; } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/financial/domain/VO/FinacialExpenseVo.java b/ruoyi-admin/src/main/java/com/ruoyi/financial/domain/VO/FinacialExpenseVo.java new file mode 100644 index 00000000..90158730 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/financial/domain/VO/FinacialExpenseVo.java @@ -0,0 +1,101 @@ +package com.ruoyi.financial.domain.VO; + +import com.ruoyi.financial.domain.FinacialExpense; + +import java.util.Date; + +public class FinacialExpenseVo extends FinacialExpense { + private static final long serialVersionUID = 1L; + /** 申请人姓名 */ + private String applyUserName; + /** 任务ID */ + private String taskId; + /** 任务名称 */ + private String taskName; + /** 办理时间 */ + private Date doneTime; + /** 创建人 */ + private String createUserName; + /** 流程实例状态 1 激活 2 挂起 */ + private String suspendState; + /** 待办用户id */ + private String todoUserId; + /** 流程实例类型名称 */ + private String instanceTypeName; + /** + * 关键词 + */ + private String keyword; + + public String getKeyword() { + return keyword; + } + + public void setKeyword(String keyword) { + this.keyword = keyword; + } + + public String getApplyUserName() { + return applyUserName; + } + + public void setApplyUserName(String applyUserName) { + this.applyUserName = applyUserName; + } + + public String getTaskId() { + return taskId; + } + + public void setTaskId(String taskId) { + this.taskId = taskId; + } + + public String getTaskName() { + return taskName; + } + + public void setTaskName(String taskName) { + this.taskName = taskName; + } + + public Date getDoneTime() { + return doneTime; + } + + public void setDoneTime(Date doneTime) { + this.doneTime = doneTime; + } + + public String getCreateUserName() { + return createUserName; + } + + public void setCreateUserName(String createUserName) { + this.createUserName = createUserName; + } + + public String getSuspendState() { + return suspendState; + } + + public void setSuspendState(String suspendState) { + this.suspendState = suspendState; + } + + public String getTodoUserId() { + return todoUserId; + } + + public void setTodoUserId(String todoUserId) { + this.todoUserId = todoUserId; + } + + public String getInstanceTypeName() { + return instanceTypeName; + } + + public void setInstanceTypeName(String instanceTypeName) { + this.instanceTypeName = instanceTypeName; + } +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/financial/mapper/FinacialExpenseMapper.java b/ruoyi-admin/src/main/java/com/ruoyi/financial/mapper/FinacialExpenseMapper.java index 143db6ce..9aaaad40 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/financial/mapper/FinacialExpenseMapper.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/financial/mapper/FinacialExpenseMapper.java @@ -2,6 +2,7 @@ package com.ruoyi.financial.mapper; import java.util.List; import com.ruoyi.financial.domain.FinacialExpense; +import com.ruoyi.financial.domain.VO.FinacialExpenseVo; /** * 报销管理Mapper接口 @@ -13,11 +14,11 @@ public interface FinacialExpenseMapper { /** * 查询报销管理 - * + * * @param expenseId 报销管理ID * @return 报销管理 */ - public FinacialExpense selectFinacialExpenseById(Long expenseId); + public FinacialExpenseVo selectFinacialExpenseById(Long expenseId); /** * 查询报销管理列表 diff --git a/ruoyi-admin/src/main/java/com/ruoyi/financial/service/IFinacialExpenseService.java b/ruoyi-admin/src/main/java/com/ruoyi/financial/service/IFinacialExpenseService.java index df18914d..784f28ba 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/financial/service/IFinacialExpenseService.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/financial/service/IFinacialExpenseService.java @@ -2,6 +2,10 @@ package com.ruoyi.financial.service; import java.util.List; import com.ruoyi.financial.domain.FinacialExpense; +import com.ruoyi.financial.domain.VO.FinacialExpenseVo; +import com.ruoyi.system.domain.Vo.BaseExpenseAccountVo; +import org.activiti.engine.runtime.ProcessInstance; +import org.springframework.transaction.annotation.Transactional; /** * 报销管理Service接口 @@ -27,6 +31,14 @@ public interface IFinacialExpenseService */ public List selectFinacialExpenseList(FinacialExpense finacialExpense); + /** + * 查询报销管理列表 + * + * @param finacialExpense 报销管理 + * @return 报销管理集合 + */ + public List selectFinacialExpenseList(FinacialExpenseVo finacialExpense); + /** * 新增报销管理 * @@ -43,6 +55,7 @@ public interface IFinacialExpenseService */ public int updateFinacialExpense(FinacialExpense finacialExpense); + /** * 批量删除报销管理 * @@ -72,4 +85,20 @@ public interface IFinacialExpenseService * @return */ int restoreFinacialExpenseById(Long expenseId); + + @Transactional(rollbackFor = Exception.class) + ProcessInstance cancelSysCustomerById(Long id); + + @Transactional(rollbackFor = Exception.class) + ProcessInstance restoreSysCustomerById(Long id); + + @Transactional(rollbackFor = Exception.class) + ProcessInstance submitApply(FinacialExpense finacialExpense); + + @Transactional(rollbackFor = Exception.class) + ProcessInstance submitApply(BaseExpenseAccountVo baseExpenseAccountVo); + + Object getId(); + + int insertFinacialExpense(BaseExpenseAccountVo baseExpenseAccountVo); } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/financial/service/impl/FinacialExpenseChild.java b/ruoyi-admin/src/main/java/com/ruoyi/financial/service/impl/FinacialExpenseChild.java new file mode 100644 index 00000000..5a3ce3e7 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/financial/service/impl/FinacialExpenseChild.java @@ -0,0 +1,189 @@ +package com.ruoyi.financial.service.impl; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.ruoyi.common.annotation.Excel; +import com.ruoyi.common.core.domain.BaseEntity; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; + +import java.util.Date; + +public class FinacialExpenseChild extends BaseEntity { + private static final long serialVersionUID = 1L; + + /** 报销单分项子表 */ + private Long expenseChildId; + + /** 关联报销单号 */ + @Excel(name = "关联报销单号") + private String expenseCode; + + /** 成本类型 */ + @Excel(name = "成本类型") + private String costType; + + /** 成本小类 */ + @Excel(name = "成本小类") + private String costSmallType; + + /** 用途 */ + @Excel(name = "用途") + private String purpose; + + /** 金额 */ + @Excel(name = "金额") + private String amounts; + + /** 报销时间 */ + @JsonFormat(pattern = "yyyy-MM-dd") + @Excel(name = "报销时间", width = 30, dateFormat = "yyyy-MM-dd") + private Date expenseTime; + + /** 出差单号 */ + @Excel(name = "出差单号") + private String evectionCode; + + /** 采购单号 */ + @Excel(name = "采购单号") + private String purchaseCode; + + /** 委外单号 */ + @Excel(name = "委外单号") + private String outsourceCode; + + /** 删除状态 */ + private String delFlag; + + private Integer index; + + public void setExpenseChildId(Long expenseChildId) + { + this.expenseChildId = expenseChildId; + } + + public Long getExpenseChildId() + { + return expenseChildId; + } + public void setExpenseCode(String expenseCode) + { + this.expenseCode = expenseCode; + } + + public String getExpenseCode() + { + return expenseCode; + } + public void setCostType(String costType) + { + this.costType = costType; + } + + public String getCostType() + { + return costType; + } + public void setCostSmallType(String costSmallType) + { + this.costSmallType = costSmallType; + } + + public String getCostSmallType() + { + return costSmallType; + } + public void setPurpose(String purpose) + { + this.purpose = purpose; + } + + public String getPurpose() + { + return purpose; + } + public void setAmounts(String amounts) + { + this.amounts = amounts; + } + + public String getAmounts() + { + return amounts; + } + public void setExpenseTime(Date expenseTime) + { + this.expenseTime = expenseTime; + } + + public Date getExpenseTime() + { + return expenseTime; + } + public void setEvectionCode(String evectionCode) + { + this.evectionCode = evectionCode; + } + + public String getEvectionCode() + { + return evectionCode; + } + public void setPurchaseCode(String purchaseCode) + { + this.purchaseCode = purchaseCode; + } + + public String getPurchaseCode() + { + return purchaseCode; + } + public void setOutsourceCode(String outsourceCode) + { + this.outsourceCode = outsourceCode; + } + + public String getOutsourceCode() + { + return outsourceCode; + } + public void setDelFlag(String delFlag) + { + this.delFlag = delFlag; + } + + public String getDelFlag() + { + return delFlag; + } + + public Integer getIndex() { + return index; + } + + public void setIndex(Integer index) { + this.index = index; + } + + @Override + public String toString() { + return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE) + .append("expenseChildId", getExpenseChildId()) + .append("expenseCode", getExpenseCode()) + .append("cost type", getCostType()) + .append("costSmallType", getCostSmallType()) + .append("purpose", getPurpose()) + .append("amounts", getAmounts()) + .append("expenseTime", getExpenseTime()) + .append("evectionCode", getEvectionCode()) + .append("purchaseCode", getPurchaseCode()) + .append("outsourceCode", getOutsourceCode()) + .append("createTime", getCreateTime()) + .append("createBy", getCreateBy()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .append("delFlag", getDelFlag()) + .append("remark", getRemark()) + .toString(); + } + +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/financial/service/impl/FinacialExpenseServiceImpl.java b/ruoyi-admin/src/main/java/com/ruoyi/financial/service/impl/FinacialExpenseServiceImpl.java deleted file mode 100644 index 13746c9d..00000000 --- a/ruoyi-admin/src/main/java/com/ruoyi/financial/service/impl/FinacialExpenseServiceImpl.java +++ /dev/null @@ -1,126 +0,0 @@ -package com.ruoyi.financial.service.impl; - -import java.util.List; -import com.ruoyi.common.utils.DateUtils; -import com.ruoyi.common.utils.ShiroUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; -import com.ruoyi.financial.mapper.FinacialExpenseMapper; -import com.ruoyi.financial.domain.FinacialExpense; -import com.ruoyi.financial.service.IFinacialExpenseService; -import com.ruoyi.common.core.text.Convert; - -/** - * 报销管理Service业务层处理 - * - * @author zhang - * @date 2024-05-31 - */ -@Service -public class FinacialExpenseServiceImpl implements IFinacialExpenseService -{ - @Autowired - private FinacialExpenseMapper finacialExpenseMapper; - - /** - * 查询报销管理 - * - * @param expenseId 报销管理ID - * @return 报销管理 - */ - @Override - public FinacialExpense selectFinacialExpenseById(Long expenseId) - { - return finacialExpenseMapper.selectFinacialExpenseById(expenseId); - } - - /** - * 查询报销管理列表 - * - * @param finacialExpense 报销管理 - * @return 报销管理 - */ - @Override - public List selectFinacialExpenseList(FinacialExpense finacialExpense) - { - return finacialExpenseMapper.selectFinacialExpenseList(finacialExpense); - } - - /** - * 新增报销管理 - * - * @param finacialExpense 报销管理 - * @return 结果 - */ - @Override - public int insertFinacialExpense(FinacialExpense finacialExpense) - { - String loginName = ShiroUtils.getLoginName(); - finacialExpense.setCreateBy(loginName); - finacialExpense.setCreateTime(DateUtils.getNowDate()); - return finacialExpenseMapper.insertFinacialExpense(finacialExpense); - } - - /** - * 修改报销管理 - * - * @param finacialExpense 报销管理 - * @return 结果 - */ - @Override - public int updateFinacialExpense(FinacialExpense finacialExpense) - { - String loginName = ShiroUtils.getLoginName(); - finacialExpense.setUpdateBy(loginName); - finacialExpense.setUpdateTime(DateUtils.getNowDate()); - return finacialExpenseMapper.updateFinacialExpense(finacialExpense); - } - - /** - * 删除报销管理对象 - * - * @param ids 需要删除的数据ID - * @return 结果 - */ - @Override - public int deleteFinacialExpenseByIds(String ids) - { - return finacialExpenseMapper.deleteFinacialExpenseByIds(Convert.toStrArray(ids)); - } - - /** - * 删除报销管理信息 - * - * @param expenseId 报销管理ID - * @return 结果 - */ - @Override - public int deleteFinacialExpenseById(Long expenseId) - { - return finacialExpenseMapper.deleteFinacialExpenseById(expenseId); - } - - /** - * 作废报销管理 - * - * @param expenseId 报销管理ID - * @return 结果 - */ - @Override - public int cancelFinacialExpenseById(Long expenseId) - { - return finacialExpenseMapper.cancelFinacialExpenseById(expenseId); - } - - /** - * 恢复报销管理信息 - * - * @param expenseId 报销管理ID - * @return 结果 - */ - @Override - public int restoreFinacialExpenseById(Long expenseId) - { - return finacialExpenseMapper.restoreFinacialExpenseById(expenseId); - } -} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/financial/service/impl/FinancialExpenseServiceImpl.java b/ruoyi-admin/src/main/java/com/ruoyi/financial/service/impl/FinancialExpenseServiceImpl.java new file mode 100644 index 00000000..46a185a0 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/financial/service/impl/FinancialExpenseServiceImpl.java @@ -0,0 +1,417 @@ +package com.ruoyi.financial.service.impl; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import com.github.pagehelper.Page; +import com.github.pagehelper.PageHelper; +import com.ruoyi.common.core.domain.entity.SysUser; +import com.ruoyi.common.core.page.PageDomain; +import com.ruoyi.common.core.page.TableSupport; +import com.ruoyi.common.core.redis.RedisCache; +import com.ruoyi.common.utils.DateUtils; +import com.ruoyi.common.utils.ShiroUtils; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.financial.domain.FinacialExpense; +import com.ruoyi.financial.domain.VO.FinacialExpenseVo; +import com.ruoyi.financial.mapper.FinacialExpenseMapper; +import com.ruoyi.financial.service.IFinacialExpenseService; +import com.ruoyi.financial.service.impl.FinacialExpenseChild; +import com.ruoyi.process.general.service.IProcessService; +import com.ruoyi.process.todoitem.mapper.BizTodoItemMapper; +import com.ruoyi.system.domain.Vo.BaseExpenseAccountVo; +import com.ruoyi.system.mapper.SysUserMapper; +import com.ruoyi.system.service.ISysRoleService; +import org.activiti.engine.TaskService; +import org.activiti.engine.impl.persistence.entity.TaskEntityImpl; +import org.activiti.engine.runtime.ProcessInstance; +import org.activiti.engine.task.Task; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.ruoyi.common.core.text.Convert; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; + +/** + * 报销单Service业务层处理 + * + * @author zhang + * @date 2024-05-20 + */ +@Service +public class FinancialExpenseServiceImpl implements IFinacialExpenseService +{ + @Autowired + private FinacialExpenseMapper finacialExpenseMapper; + + @Autowired + private RedisCache redisCache; + + + @Autowired + private SysUserMapper userMapper; + + @Autowired + private TaskService taskService; + + @Autowired + private BizTodoItemMapper todoItemMapper; + + @Autowired + private IProcessService processService; + + @Autowired + private ISysRoleService roleService; + + /** + * 查询报销单 + * + * @param expenseId 报销单ID + * @return 报销单 + */ + @Override + public FinacialExpenseVo selectFinacialExpenseById(Long expenseId) + { + FinacialExpenseVo finacialExpenseVo = finacialExpenseMapper.selectFinacialExpenseById(expenseId); + SysUser sysUser2 = userMapper.selectUserByLoginName(finacialExpenseVo.getApplyUser()); + if (sysUser2!=null){ + finacialExpenseVo.setApplyUserName(sysUser2.getUserName()); + } + return finacialExpenseVo; + } + + @Override + public List selectFinacialExpenseList(FinacialExpense finacialExpense) { + return finacialExpenseMapper.selectFinacialExpenseList(finacialExpense); + } + + /** + * 查询报销单列表 + * + * @param finacialExpense 报销单 + * @return 报销单 + */ + @Override + public List selectFinacialExpenseList(FinacialExpenseVo finacialExpense) + { + PageDomain pageDomain = TableSupport.buildPageRequest(); + Integer pageNum = pageDomain.getPageNum(); + Integer pageSize = pageDomain.getPageSize(); + PageHelper.startPage(pageNum, pageSize); + //PageHelper 仅对第一List分页有效 + Page list = (Page) selectFinacialExpenseList(finacialExpense); + Page returnList = new Page<>(); + for(FinacialExpenseVo finacialExpenseVo : list){ + SysUser sysUser = userMapper.selectUserByLoginName(finacialExpenseVo.getCreateBy()); + if (sysUser != null) { + finacialExpenseVo.setCreateBy(sysUser.getUserName()); + } + SysUser sysUser2 = userMapper.selectUserByLoginName(finacialExpenseVo.getApplyUser()); + if (sysUser2!=null){ + finacialExpenseVo.setApplyUserName(sysUser2.getUserName()); + } + String instanceId = finacialExpenseVo.getInstanceId(); + // 当前环节 + if (StringUtils.isNotBlank(instanceId)) { + List taskList = taskService.createTaskQuery() + .processInstanceId(instanceId) +// .singleResult(); + .list(); // 例如请假会签,会同时拥有多个任务 + if (!CollectionUtils.isEmpty(taskList)) { + TaskEntityImpl task = (TaskEntityImpl) taskList.get(0); + String taskId = task.getId(); + finacialExpenseVo.setTaskId(taskId); + // 设置待办用户 + List todoUserList = todoItemMapper.selectUndealTodoUserList(taskId); + if(!CollectionUtils.isEmpty(taskList)){ + finacialExpenseVo.setTodoUserId(String.join(",",todoUserList)); + } + if (task.getSuspensionState() == 2) { + finacialExpenseVo.setTaskName("已挂起"); + finacialExpenseVo.setSuspendState("2"); + } else { + finacialExpenseVo.setTaskName(task.getName()); + finacialExpenseVo.setSuspendState("1"); + } + } else { + // 已办结或者已撤销 + finacialExpenseVo.setTaskName("已结束"); + } + } else { + finacialExpenseVo.setTaskName("未启动"); + } + returnList.add(finacialExpenseVo); + } + returnList.setTotal(CollectionUtils.isEmpty(list) ? 0 : list.getTotal()); + returnList.setPageNum(pageNum); + returnList.setPageSize(pageSize); + return returnList; + } + + /** + * 新增报销单 + * + * @param finacialExpense 报销单 + * @return 结果 + */ + @Override + public int insertFinacialExpense(FinacialExpense finacialExpense) + { + String loginName = ShiroUtils.getLoginName(); + finacialExpense.setCreateBy(loginName); + finacialExpense.setCreateTime(DateUtils.getNowDate()); + finacialExpense.setDelFlag("0"); +// finacialExpense.setExpenseCode(redisCache.generateBillNo("BX")); +// List finacialExpenseChildList = finacialExpense.getExpenseAccountChildList(); +// if (!CollectionUtils.isEmpty(finacialExpenseChildList)) { +// for (FinacialExpenseChild finacialExpenseChild :finacialExpenseChildList) { +// finacialExpenseChild.setCreateBy(loginName); +// finacialExpenseChild.setCreateTime(DateUtils.getNowDate()); +// //获取父表的单号 +// finacialExpenseChild.setExpenseCode(finacialExpense.getExpenseCode()); +// finacialExpenseChildService.insertFinacialExpenseChild(finacialExpenseChild); +// } +// } + return finacialExpenseMapper.insertFinacialExpense(finacialExpense); + } + + /** + * 修改报销单 (暂时去掉子表数据,后续添加) + * + * @param finacialExpense 报销单 + * @return 结果 + */ + @Override + public int updateFinacialExpense(FinacialExpense finacialExpense) + { + String loginName = ShiroUtils.getLoginName(); + finacialExpense.setUpdateBy(loginName); + finacialExpense.setUpdateTime(DateUtils.getNowDate()); + finacialExpense.setDelFlag("0"); +// List finacialExpenseChildList = finacialExpense.getExpenseAccountChildList(); +// if (!CollectionUtils.isEmpty(finacialExpenseChildList)) { +// finacialExpenseChildService.deleteFinacialExpenseChildByExpenseCode(finacialExpense.getExpenseCode()); +// for (FinacialExpenseChild finacialExpenseChild :finacialExpenseChildList) { +// finacialExpenseChild.setCreateBy(loginName); +// finacialExpenseChild.setCreateTime(DateUtils.getNowDate()); +// //获取父表的单号 +// finacialExpenseChild.setExpenseCode(finacialExpense.getExpenseCode()); +// finacialExpenseChildService.insertFinacialExpenseChild(finacialExpenseChild); +// } +// } + return finacialExpenseMapper.updateFinacialExpense(finacialExpense); + } + + /** + * 删除报销单对象 + * + * @param ids 需要删除的数据ID + * @return 结果 + */ + @Override + public int deleteFinacialExpenseByIds(String ids) + { + return finacialExpenseMapper.deleteFinacialExpenseByIds(Convert.toStrArray(ids)); + } + + /** + * 删除报销单信息 + * + * @param expenseId 报销单ID + * @return 结果 + */ + @Override + public int deleteFinacialExpenseById(Long expenseId) + { + return finacialExpenseMapper.deleteFinacialExpenseById(expenseId); + } + + /** + * 作废报销单 + * + * @param expenseId 报销单ID + * @return 结果 + */ + @Override + public int cancelFinacialExpenseById(Long expenseId) + { + return finacialExpenseMapper.cancelFinacialExpenseById(expenseId); + } + + /** + * 恢复报销单信息 + * + * @param expenseId 报销单ID + * @return 结果 + */ + @Override + public int restoreFinacialExpenseById(Long expenseId) + { + return finacialExpenseMapper.restoreFinacialExpenseById(expenseId); + } + @Override + @Transactional(rollbackFor = Exception.class) + public ProcessInstance cancelSysCustomerById(Long id) { + FinacialExpenseVo finacialExpenseVo = finacialExpenseMapper.selectFinacialExpenseById(id); + // 审核状态-待审核 + finacialExpenseVo.setAuditStatus("0"); + SysUser user = ShiroUtils.getSysUser(); + // 启动流程 + String applyTitle = user.getUserName()+"发起了客户信息作废审批-"+ DateUtils.dateTimeNow(); + String instanceType = "cancel"; + FinacialExpense finacialExpense = new FinacialExpense(); + BeanUtils.copyProperties(finacialExpenseVo,finacialExpense); + ProcessInstance processInstance = startProcessInstance(applyTitle,instanceType,finacialExpense, user); + String processInstanceId = processInstance.getProcessInstanceId(); + // 作废实例id + finacialExpense.setCancelInstanceId(processInstanceId); + // 存在提交完就流程结束的情况 + boolean processIsFinish = processService.judgeProcessIsFinish(processInstanceId); + if(processIsFinish){ + // 审核状态-审核通过 + finacialExpense.setAuditStatus("1"); + // 使用状态-已作废 + finacialExpense.setUseStatus("2"); + } + finacialExpenseMapper.updateFinacialExpense(finacialExpense); + return processInstance; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public ProcessInstance restoreSysCustomerById(Long id) { + FinacialExpenseVo finacialExpenseVo = finacialExpenseMapper.selectFinacialExpenseById(id); + // 审核状态-待审核 + finacialExpenseVo.setAuditStatus("0"); + SysUser user = ShiroUtils.getSysUser(); + // 启动流程 + String applyTitle = user.getUserName()+"发起了客户恢复审批-"+DateUtils.dateTimeNow(); + String instanceType = "restore"; + FinacialExpense finacialExpense = new FinacialExpense(); + BeanUtils.copyProperties(finacialExpenseVo,finacialExpense); + ProcessInstance processInstance = startProcessInstance(applyTitle,instanceType,finacialExpense, user); + String processInstanceId = processInstance.getProcessInstanceId(); + // 恢复实例id + finacialExpense.setRestoreInstanceId(processInstanceId); + // 存在提交完就流程结束的情况 + boolean processIsFinish = processService.judgeProcessIsFinish(processInstanceId); + if(processIsFinish){ + // 审核状态-审核通过 + finacialExpense.setAuditStatus("1"); + // 使用状态-是 + finacialExpense.setUseStatus("1"); + } + finacialExpenseMapper.updateFinacialExpense(finacialExpense); + return processInstance; + } + + + /** + * 提交申请 + * @param finacialExpense + * @return + */ + @Override + @Transactional(rollbackFor = Exception.class) + public ProcessInstance submitApply(FinacialExpense finacialExpense) { + SysUser user = ShiroUtils.getSysUser(); + finacialExpense.setApplyUser(user.getLoginName()); + finacialExpense.setApplyTime(DateUtils.getNowDate()); + insertFinacialExpense(finacialExpense); + if (finacialExpense.getExpenseId() == null || finacialExpense.getExpenseId() == 0){ + insertFinacialExpense(finacialExpense); + } + // 启动流程 + String applyTitle = user.getUserName()+"发起了报销管理提交审批-"+DateUtils.dateTimeNow(); + String instanceType = "submit"; + ProcessInstance processInstance = startProcessInstance(applyTitle,instanceType,finacialExpense, user); + String processInstanceId = processInstance.getProcessInstanceId(); + // 提交实例id + finacialExpense.setSubmitInstanceId(processInstanceId); + // 存在提交完就流程结束的情况 + boolean processIsFinish = processService.judgeProcessIsFinish(processInstanceId); + if(processIsFinish){ + // 审核状态-审核通过 + finacialExpense.setAuditStatus("1"); + // 使用状态-是 + finacialExpense.setUseStatus("1"); + //设置财务审核状态 + finacialExpense.setFinanceAuditStatus("1"); + + } + finacialExpenseMapper.updateFinacialExpense(finacialExpense); + return processInstance; + } + + + private ProcessInstance startProcessInstance(String applyTitle, String instanceType, FinacialExpense finacialExpense, SysUser user) { + Long expenseId = finacialExpense.getExpenseId(); + String businessKey = expenseId.toString(); // 实体类 ID,作为流程的业务 key + String key = "expense"; + Map variables = new HashMap<>(); + // 构造authority传参 + buildAuthority(user, variables); + finacialExpense.setApplyTitle(applyTitle); + // 启动流程 + ProcessInstance processInstance = processService.submitApply(user.getLoginName(), businessKey, applyTitle, + finacialExpense.getExpenseCode(), key, variables); + String processInstanceId = processInstance.getId(); + finacialExpense.setInstanceId(processInstanceId); // 建立双向关系 + finacialExpense.setInstanceType(instanceType); + return processInstance; + } + + private void buildAuthority(SysUser user, Map variables) { + Set roleKeys = roleService.selectRoleKeys(user.getUserId()); + variables.put("authority",1); + //判断请购人的角色,进入相应的逻辑,设置节点审批人变量 + } + @Override + public Object getId() { + return redisCache.generateBillNo("BX"); + } + + @Override + public int insertFinacialExpense(BaseExpenseAccountVo baseExpenseAccountVo) { + return 0; + } + + public ProcessInstance submitApply(BaseExpenseAccountVo baseExpenseAccountVo) { + //将对应的baseExpense数据插入到finacial_expense表 + FinacialExpense finacialExpense = new FinacialExpense(); + BeanUtils.copyProperties(baseExpenseAccountVo,finacialExpense); + finacialExpense.setFinanceAuditStatus("1"); + SysUser user = ShiroUtils.getSysUser(); + finacialExpense.setApplyUser(user.getLoginName()); + finacialExpense.setApplyTime(DateUtils.getNowDate()); + insertFinacialExpense(finacialExpense); + if (finacialExpense.getExpenseId() == null || finacialExpense.getExpenseId() == 0){ + insertFinacialExpense(finacialExpense); + } + // 启动流程 + String applyTitle = user.getUserName()+"发起了报销管理提交审批-"+DateUtils.dateTimeNow(); + String instanceType = "submit"; + ProcessInstance processInstance = startProcessInstance(applyTitle,instanceType,finacialExpense, user); + String processInstanceId = processInstance.getProcessInstanceId(); + // 提交实例id + finacialExpense.setSubmitInstanceId(processInstanceId); + // 存在提交完就流程结束的情况 + boolean processIsFinish = processService.judgeProcessIsFinish(processInstanceId); + if(processIsFinish){ + // 审核状态-审核通过 + finacialExpense.setAuditStatus("1"); + // 使用状态-是 + finacialExpense.setUseStatus("1"); + //设置财务审核状态 + finacialExpense.setFinanceAuditStatus("1"); + + } + finacialExpenseMapper.updateFinacialExpense(finacialExpense); + return processInstance; + } + + +} diff --git a/ruoyi-admin/src/main/resources/mapper/financial/FinacialExpenseMapper.xml b/ruoyi-admin/src/main/resources/mapper/financial/FinacialExpenseMapper.xml index 1ce92011..8993b5b5 100644 --- a/ruoyi-admin/src/main/resources/mapper/financial/FinacialExpenseMapper.xml +++ b/ruoyi-admin/src/main/resources/mapper/financial/FinacialExpenseMapper.xml @@ -4,54 +4,98 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - select expense_id, audit_status, manager_audit_status, finance_audit_status, expense_code, deptName, postName, fullName, expense_method, is_purchase_outsource, supplier_code, corporate_payee, corporate_receiving_account, public_account_banks, apply_user, create_by, create_time, update_by, update_time, remark, use_status, del_flag from finacial_expense + select expense_id, audit_status, manager_audit_status, + finance_audit_status, expense_code, deptName, postName, fullName, + expense_method, is_purchase_outsource, supplier_code, corporate_payee, + corporate_receiving_account, public_account_banks, apply_user, create_by, + create_time, update_by, update_time, remark, use_status, del_flag + from financial_expense - insert into finacial_expense + insert into financial_expense audit_status, manager_audit_status, @@ -75,15 +119,20 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" corporate_payee, corporate_receiving_account, public_account_banks, - apply_user, create_by, create_time, - update_by, - update_time, remark, use_status, + instance_id, + instance_type, + submit_instance_id, + cancel_instance_id, + restore_instance_id, + apply_title, + apply_user, + apply_time, del_flag, - + #{auditStatus}, #{managerAuditStatus}, @@ -98,19 +147,24 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" #{corporatePayee}, #{corporateReceivingAccount}, #{publicAccountBanks}, - #{applyUser}, #{createBy}, #{createTime}, - #{updateBy}, - #{updateTime}, #{remark}, #{useStatus}, + #{instanceId}, + #{instanceType}, + #{submitInstanceId}, + #{cancelInstanceId}, + #{restoreInstanceId}, + #{applyTitle}, + #{applyUser}, + #{applyTime}, #{delFlag}, - + - update finacial_expense + update financial_expense audit_status = #{auditStatus}, manager_audit_status = #{managerAuditStatus}, @@ -125,35 +179,57 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" corporate_payee = #{corporatePayee}, corporate_receiving_account = #{corporateReceivingAccount}, public_account_banks = #{publicAccountBanks}, - apply_user = #{applyUser}, - create_by = #{createBy}, - create_time = #{createTime}, update_by = #{updateBy}, update_time = #{updateTime}, remark = #{remark}, use_status = #{useStatus}, + instance_id = #{instanceId}, + instance_type = #{instanceType}, + submit_instance_id = #{submitInstanceId}, + cancel_instance_id = #{cancelInstanceId}, + restore_instance_id = #{restoreInstanceId}, + apply_title = #{applyTitle}, + apply_user = #{applyUser}, + apply_time = #{applyTime}, del_flag = #{delFlag}, where expense_id = #{expenseId} - delete from finacial_expense where expense_id = #{expenseId} + delete from financial_expense where expense_id = #{expenseId} - delete from finacial_expense where expense_id in + delete from financial_expense where expense_id in #{expenseId} + + delete from financial_expense where expense_code = #{expenseCode} + + + delete from financial_expense where expense_code in + + #{expenseCode} + + - update finacial_expense set del_flag = '1' where expense_id = #{expenseId} + update financial_expense set del_flag = '1' where expense_id = #{expenseId} - - update finacial_expense set del_flag = '0' where expense_id = #{expenseId} + update financial_expense set del_flag = '0' where expense_id = #{expenseId} + + + update financial_expense set del_flag = '1' where expense_code in + + #{expenseCode} + + + update financial_expense set del_flag = '1' where expense_code = #{expenseCode} + \ No newline at end of file diff --git a/ruoyi-admin/src/main/resources/templates/financial/expense/expense.html b/ruoyi-admin/src/main/resources/templates/financial/expense/expense.html index 4ca04a5d..9b8545fa 100644 --- a/ruoyi-admin/src/main/resources/templates/financial/expense/expense.html +++ b/ruoyi-admin/src/main/resources/templates/financial/expense/expense.html @@ -12,21 +12,23 @@
  • - +
  • - +
  • - - + +
  • - - + + +
  • +
  • + +
  • @@ -54,14 +56,14 @@
  • -
  • -
  • @@ -89,22 +91,30 @@
    -
    +
    + + \ No newline at end of file