Browse Source

[fix]

基础资料 报销单
修改添加报销单页面表格定义,去除行内编辑样式;
修改报销单实体类,新增报销金额字段;
修改报销单mapper对应方法,新增字段;
修改确认打款跳转controller方法,添加报销金额赋值语句;
修改新增报销单service方法,添加报销金额合计赋值;
修改流程启动结束service方法,设置财务审核状态为待打款;
修改确认打款更新关联订单子表打款状态service方法,修改更新委外订单打款状态service方法,修改更新应付账款记录付款相关信息service方法;
修改确认打款页面,打款金额改为自动获取只读;
dev
王晓迪 1 month ago
parent
commit
9db75dc84d
  1. 1
      ruoyi-admin/src/main/java/com/ruoyi/system/controller/BaseExpenseAccountController.java
  2. 14
      ruoyi-admin/src/main/java/com/ruoyi/system/domain/BaseExpenseAccount.java
  3. 10
      ruoyi-admin/src/main/java/com/ruoyi/system/service/impl/BaseExpenseAccountServiceImpl.java
  4. 99
      ruoyi-admin/src/main/java/com/ruoyi/system/service/impl/BaseExpenseConfirmAmountServiceImpl.java
  5. 9
      ruoyi-admin/src/main/resources/mapper/system/BaseExpenseAccountMapper.xml
  6. 10
      ruoyi-admin/src/main/resources/templates/system/baseExpense/add.html
  7. 7
      ruoyi-admin/src/main/resources/templates/system/baseExpense/confirmPayment.html

1
ruoyi-admin/src/main/java/com/ruoyi/system/controller/BaseExpenseAccountController.java

@ -435,6 +435,7 @@ public class BaseExpenseAccountController extends BaseController
baseExpenseConfirmAmount.setExpenseCode(baseExpenseAccount.getExpenseCode());
baseExpenseConfirmAmount.setExpenseMethod(baseExpenseAccount.getExpenseMethod());
baseExpenseConfirmAmount.setFullName(baseExpenseAccount.getFullName());
baseExpenseConfirmAmount.setAmount(baseExpenseAccount.getExpenseAmount());
mmap.put("baseExpenseAccount", baseExpenseConfirmAmount);
return prefix + "/confirmPayment";
}

14
ruoyi-admin/src/main/java/com/ruoyi/system/domain/BaseExpenseAccount.java

@ -6,6 +6,7 @@ import org.apache.commons.lang3.builder.ToStringStyle;
import com.ruoyi.common.annotation.Excel;
import com.ruoyi.common.core.domain.BaseEntity;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
@ -30,7 +31,7 @@ public class BaseExpenseAccount extends BaseEntity
@Excel(name = "总经理审核状态")
private String managerAuditStatus;
/** 财务审核状态 */
/** 财务审核状态(0待审核,1审核通过,2审核拒绝,3待打款,4已打款) */
@Excel(name = "财务审核状态")
private String financeAuditStatus;
@ -106,7 +107,8 @@ public class BaseExpenseAccount extends BaseEntity
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date applyTime;
/** 报销金额 */
private BigDecimal expenseAmount;
private List<BaseExpenseAccountChild> expenseAccountChildList;
@ -328,6 +330,14 @@ public class BaseExpenseAccount extends BaseEntity
return useStatus;
}
public BigDecimal getExpenseAmount() {
return expenseAmount;
}
public void setExpenseAmount(BigDecimal expenseAmount) {
this.expenseAmount = expenseAmount;
}
@Override
public String toString() {
return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)

10
ruoyi-admin/src/main/java/com/ruoyi/system/service/impl/BaseExpenseAccountServiceImpl.java

@ -1,5 +1,6 @@
package com.ruoyi.system.service.impl;
import java.math.BigDecimal;
import java.util.*;
import java.util.stream.Collectors;
@ -201,6 +202,7 @@ public class BaseExpenseAccountServiceImpl implements IBaseExpenseAccountService
baseExpenseAccount.setCreateTime(DateUtils.getNowDate());
baseExpenseAccount.setDelFlag("0");
baseExpenseAccount.setExpenseCode(redisCache.generateBillNo("BX"));
BigDecimal expenseAmount = BigDecimal.ZERO;
List<BaseExpenseAccountChild> baseExpenseAccountChildList = baseExpenseAccount.getExpenseAccountChildList();
if (!CollectionUtils.isEmpty(baseExpenseAccountChildList)) {
for (BaseExpenseAccountChild baseExpenseAccountChild :baseExpenseAccountChildList) {
@ -209,8 +211,10 @@ public class BaseExpenseAccountServiceImpl implements IBaseExpenseAccountService
//获取父表的单号
baseExpenseAccountChild.setExpenseCode(baseExpenseAccount.getExpenseCode());
baseExpenseAccountChildService.insertBaseExpenseAccountChild(baseExpenseAccountChild);
expenseAmount = expenseAmount.add(baseExpenseAccountChild.getAmounts());
}
}
baseExpenseAccount.setExpenseAmount(expenseAmount);
return baseExpenseAccountMapper.insertBaseExpenseAccount(baseExpenseAccount);
}
@ -408,7 +412,7 @@ public class BaseExpenseAccountServiceImpl implements IBaseExpenseAccountService
//设置总经理审核状态
baseExpenseAccount.setManagerAuditStatus("1");
//设置财务审核状态
baseExpenseAccount.setFinanceAuditStatus("1");
baseExpenseAccount.setFinanceAuditStatus("3");//待打款
}
baseExpenseAccountMapper.updateBaseExpenseAccount(baseExpenseAccount);
@ -500,7 +504,7 @@ public class BaseExpenseAccountServiceImpl implements IBaseExpenseAccountService
variables.put("zgExist",true);
variables.put("jlExist",false);
}
if(roleKeys.contains("admin")||roleKeys.contains("ywjlRole")||roleKeys.contains("yfzjRole")
if(roleKeys.contains("ywjlRole")||roleKeys.contains("yfzjRole")
||roleKeys.contains("fzjlRole")||roleKeys.contains("pzjlRole")
||roleKeys.contains("shjlRole") ||roleKeys.contains("cwzgRole")
||roleKeys.contains("zozjRole")){
@ -511,7 +515,7 @@ public class BaseExpenseAccountServiceImpl implements IBaseExpenseAccountService
//财务审核转到总经理
variables.put("authority",2);
}
if(roleKeys.contains("zjlRole")){
if(roleKeys.contains("admin")||roleKeys.contains("zjlRole")){
//总经理直接通过
variables.put("authority",3);
}

99
ruoyi-admin/src/main/java/com/ruoyi/system/service/impl/BaseExpenseConfirmAmountServiceImpl.java

@ -1,10 +1,7 @@
package com.ruoyi.system.service.impl;
import java.math.BigDecimal;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.Set;
import java.util.*;
import java.util.stream.Collectors;
import com.ruoyi.common.exception.BusinessException;
@ -152,7 +149,8 @@ public class BaseExpenseConfirmAmountServiceImpl implements IBaseExpenseConfirmA
for (BaseExpenseAccountChild child: expenseChildren) {
if(child.getPurchaseCode()!=null&&!child.getPurchaseCode().isEmpty()){
// 更新应付账款打款相关信息
int rows = updateFinancialPayableInfo(child.getPurchaseCode(),supplierCode,baseExpenseConfirmAmount);
FinancialAccountsPayable payable = updateFinancialPayableInfo(child.getPurchaseCode(),child,supplierCode,baseExpenseConfirmAmount);
int rows = accountsPayableMapper.updateFinancialAccountsPayable(payable);
if(rows<= 0){
throw new BusinessException("更新应付账款记录失败!");
}
@ -161,10 +159,9 @@ public class BaseExpenseConfirmAmountServiceImpl implements IBaseExpenseConfirmA
if(purchaseOrder == null){
throw new BusinessException("关联采购订单"+purchaseOrderCode+"不存在!");
}
BigDecimal paidPrice = child.getAmounts();
if(paidPrice.compareTo(purchaseOrder.getRmbSum()) == 0){
if(payable.getAccountsPayableStatus().equals("2")){
purchaseOrder.setPaymentStatus("4");//已结案
}else if(paidPrice.compareTo(purchaseOrder.getRmbSum()) < 0){
}else {
purchaseOrder.setPaymentStatus("1");//部分打款(需要手动结案)
}
purchaseOrder.setUpdateBy(ShiroUtils.getLoginName());
@ -177,7 +174,8 @@ public class BaseExpenseConfirmAmountServiceImpl implements IBaseExpenseConfirmA
}
else if(child.getOutsourceCode()!=null&&!child.getOutsourceCode().isEmpty()){
// 更新应付账款打款相关信息
int rows = updateFinancialPayableInfo(child.getOutsourceCode(),supplierCode,baseExpenseConfirmAmount);
FinancialAccountsPayable payable = updateFinancialPayableInfo(child.getOutsourceCode(), child,supplierCode,baseExpenseConfirmAmount);
int rows = accountsPayableMapper.updateFinancialAccountsPayable(payable);
if(rows<= 0){
throw new BusinessException("更新应付账款记录失败!");
}
@ -186,13 +184,23 @@ public class BaseExpenseConfirmAmountServiceImpl implements IBaseExpenseConfirmA
tempOutDetail.setOutsourceOrderNo(child.getOutsourceCode());
tempOutDetail.setSupplierCode(supplierCode);
List<OutsourceOrderDetail> outOrderDetails = outOrderDetailMapper.selectOutsourceOrderDetailList(tempOutDetail);
if(StringUtils.isEmpty(outOrderDetails)){
throw new BusinessException("未找到关联委外订单详情信息!");
}
if(CollectionUtils.isNotEmpty(outOrderDetails)){
for (OutsourceOrderDetail detail: outOrderDetails) {
detail.setRemitStatus("2");
detail.setClosedStatus("0");
if(payable.getAccountsPayableStatus().equals("1")){//部分付款
detail.setRemitStatus("1");
detail.setClosedStatus("1");
}else{//全部打款
detail.setRemitStatus("2");
detail.setClosedStatus("2");
}
outOrderDetailMapper.updateOutsourceOrderDetail(detail);
updateResult ++;
}
if(updateResult <= 0){
throw new BusinessException("委外订单详情记录更新失败!");
}
@ -210,37 +218,23 @@ public class BaseExpenseConfirmAmountServiceImpl implements IBaseExpenseConfirmA
// 更新委外订单打款状态
public int updateOutsourceOrderPayableStatus(String outsourceOrderCode){
OutsourceOrder outsourceOrder = outsourceOrderMapper.selectOutsourceOrderByNo(outsourceOrderCode);
OutsourceOrderDetail temp = new OutsourceOrderDetail();
temp.setOutsourceOrderNo(outsourceOrderCode);
List<OutsourceOrderDetail> outsourceOrderDetails = outOrderDetailMapper.selectOutsourceOrderDetailList(temp);
if(CollectionUtils.isEmpty(outsourceOrderDetails)){
throw new BusinessException("委外订单详情记录为空!");
FinancialAccountsPayable temp = new FinancialAccountsPayable();
temp.setRelevanceCode(outsourceOrderCode);
List<FinancialAccountsPayable> payableList = accountsPayableMapper.selectFinancialAccountsPayableList(temp);
if(CollectionUtils.isEmpty(payableList)){
throw new BusinessException("未找到应付账款记录!");
}
String isAllPaid = "3";
// 获取所有 paymentStatus 的集合
Set<String> statuses = outsourceOrderDetails.stream()
.map(OutsourceOrderDetail::getRemitStatus)
.collect(Collectors.toSet());
// 判断状态
if (statuses.size() == 1) {
String singleStatus = statuses.iterator().next();
if (singleStatus.equals("0")) {
isAllPaid = "0";
} else if (singleStatus.equals("2")) {
isAllPaid = "1";
boolean allClosed = true;
//根据应付账款打款信息更新订单状态
for (FinancialAccountsPayable payable: payableList) {
if(!payable.getAccountsPayableStatus().equals("2")){
allClosed = false;
}
} else if (statuses.size() == 2 && statuses.contains("0") && statuses.contains("2")) {
isAllPaid = "2";
}
if(isAllPaid.equals("1")){
// 订单内供应商全部打款
outsourceOrder.setClosedStatus("2");
}else if(isAllPaid.equals("0")){
// 订单内供应商全未打款
outsourceOrder.setClosedStatus("0");
}else if(isAllPaid.equals("2")){
outsourceOrder.setClosedStatus("1");
if(allClosed){
outsourceOrder.setClosedStatus("4");//已结案
}else{
outsourceOrder.setClosedStatus("1");//部分打款
}
OutsourceOrderVO outsourceOrderVO = new OutsourceOrderVO();
outsourceOrderVO.setOutsourceOrderId(outsourceOrder.getOutsourceOrderId());
@ -248,35 +242,38 @@ public class BaseExpenseConfirmAmountServiceImpl implements IBaseExpenseConfirmA
return outsourceOrderMapper.updateOutsourceOrder(outsourceOrderVO);
}
// 更新应付账款记录付款相关信息
public int updateFinancialPayableInfo(String relatedCode, String supplierCode, BaseExpenseConfirmAmount baseExpenseConfirmAmount){
public FinancialAccountsPayable updateFinancialPayableInfo(String relatedCode,BaseExpenseAccountChild child, String supplierCode, BaseExpenseConfirmAmount baseExpenseConfirmAmount){
FinancialAccountsPayable temp = new FinancialAccountsPayable();
temp.setRelevanceCode(relatedCode);
temp.setSupplierCode(supplierCode);
List<FinancialAccountsPayable> payableList = accountsPayableMapper.selectFinancialAccountsPayableList(temp);
if(CollectionUtils.isEmpty(payableList)){
FinancialAccountsPayable accountsPayable = accountsPayableMapper.selectFinancialAccountsPayableByCode(temp);
if(accountsPayable == null){
throw new BusinessException("未找到应付账款记录!");
}
FinancialAccountsPayable accountsPayable = payableList.get(0);
BigDecimal paidPrice = baseExpenseConfirmAmount.getAmount();
BigDecimal paidPrice = child.getAmounts();
int insertResult = insertFinancialPayableRecord(accountsPayable.getAccountsPayableCode(),relatedCode,baseExpenseConfirmAmount);
if(insertResult <= 0){
throw new BusinessException("插入应付账款付款记录失败!");
}
accountsPayable.setPaidPrice(paidPrice);
accountsPayable.setActualPaidPrice(paidPrice);
/*更新实付金额*/
BigDecimal actualPaidPrice = Optional.ofNullable(accountsPayable.getActualPaidPrice()).orElse(BigDecimal.ZERO);
actualPaidPrice = actualPaidPrice.add(paidPrice);
accountsPayable.setPaidPrice(actualPaidPrice);
accountsPayable.setActualPaidPrice(actualPaidPrice);
/*更新未付金额*/
BigDecimal shoudPay = accountsPayable.getPriceIncludesTax();
accountsPayable.setUnpaidPrice(shoudPay.subtract(paidPrice));
if(paidPrice.compareTo(shoudPay) == 0 ){
/*更新付款结案状态*/
if(actualPaidPrice.compareTo(shoudPay) >= 0 ){
accountsPayable.setAccountsPayableStatus("2");//已结案
}else if(paidPrice.compareTo(shoudPay) < 0){
}else if(actualPaidPrice.compareTo(shoudPay) < 0){
accountsPayable.setAccountsPayableStatus("1");//部分打款(需要手动结案)
}
accountsPayable.setPaidTime(baseExpenseConfirmAmount.getExpenseDate());
accountsPayable.setOperatorPeople(ShiroUtils.getLoginName());
accountsPayable.setUpdateBy(ShiroUtils.getLoginName());
accountsPayable.setUpdateTime(DateUtils.getNowDate());
int rows = accountsPayableMapper.updateFinancialAccountsPayable(accountsPayable);
return rows;
return accountsPayable;
}
// 新建应付账款付款记录
public int insertFinancialPayableRecord(String accountsPayableCode, String relatedCode, BaseExpenseConfirmAmount baseExpenseConfirmAmount){
@ -285,7 +282,7 @@ public class BaseExpenseConfirmAmountServiceImpl implements IBaseExpenseConfirmA
payableRecords.setRelevanceCode(relatedCode);
payableRecords.setPaidPrice(baseExpenseConfirmAmount.getAmount());
payableRecords.setPaidTime(baseExpenseConfirmAmount.getExpenseDate());
payableRecords.setOperatorPeople(baseExpenseConfirmAmount.getFullName());
payableRecords.setOperatorPeople(ShiroUtils.getLoginName());
payableRecords.setCreateBy(ShiroUtils.getLoginName());
payableRecords.setCreateTime(DateUtils.getNowDate());
int rows = payableRecordsMapper.insertFinancialPayableRecords(payableRecords);

9
ruoyi-admin/src/main/resources/mapper/system/BaseExpenseAccountMapper.xml

@ -36,7 +36,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<result property="applyUser" column="apply_user" />
<result property="applyTime" column="apply_time" />
<result property="delFlag" column="del_flag" />
<result property="expenseAmount" column="expense_amount" />
</resultMap>
<sql id="selectBaseExpenseAccountVo">
@ -45,7 +45,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
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,
instance_id, instance_type, submit_instance_id, cancel_instance_id, restore_instance_id,
apply_title, apply_user, apply_time
apply_title, apply_user, apply_time, expense_amount
from base_expense_account
</sql>
@ -55,7 +55,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
b.supplier_code, b.corporate_payee, b.corporate_receiving_account, b.public_account_banks,
b.apply_user, b.create_by, b.create_time, b.update_by, b.update_time, b.remark, b.use_status, b.del_flag,
b.instance_id, b.instance_type, p.dict_value as instance_type_name, b.submit_instance_id, b.cancel_instance_id, b.restore_instance_id,
b.apply_title, b.apply_user, b.apply_time
b.apply_title, b.apply_user, b.apply_time, b.expense_amount
from base_expense_account as b
left join (
select dict_value, dict_label from sys_dict_data where dict_type = 'processType'
@ -138,6 +138,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="applyUser != null">apply_user,</if>
<if test="applyTime != null">apply_time,</if>
<if test="delFlag != null">del_flag,</if>
<if test="expenseAmount != null">expense_amount,</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="auditStatus != null">#{auditStatus},</if>
@ -166,6 +167,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="applyUser != null">#{applyUser},</if>
<if test="applyTime != null">#{applyTime},</if>
<if test="delFlag != null">#{delFlag},</if>
<if test="expenseAmount != null">#{expenseAmount},</if>
</trim>
</insert>
@ -198,6 +200,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="applyUser != null">apply_user = #{applyUser},</if>
<if test="applyTime != null">apply_time = #{applyTime},</if>
<if test="delFlag != null">del_flag = #{delFlag},</if>
<if test="expenseAmount != null">expense_amount = #{expenseAmount},</if>
</trim>
where expense_id = #{expenseId}
</update>

10
ruoyi-admin/src/main/resources/templates/system/baseExpense/add.html

@ -130,9 +130,9 @@
{title: '成本小类',field:'costSmallType',
formatter:function(value, row, index){return getCostSmallType(value,row,index)}
},
{title: '用途',field: 'purpose', editable:{type:'text', mode:'inline',}},
{title: '用途',field: 'purpose', editable:{type:'text', }},
{title: '金额',field: 'amounts',
editable:{type:'text', mode:'inline',
editable:{type:'text',
validate: function(value, row){
//金额可以为最多两位小数点
var reg = /^[0-9]+([.]{1}[0-9]{1,2})?$/;
@ -152,9 +152,9 @@
}
},
{title: '报销时间',field: 'expenseTime', visible: false, editable: {type: 'date',title: '报销时间', placement: 'left',}},
{title: '出差单号',field: 'evectionCode',editable:{type:'text', mode:'inline',}},
{title: '采购单号',field: 'purchaseCode',editable:{type:'text', mode:'inline',}},
{title: '委外单号',field: 'outsourceCode',editable:{type:'text', mode:'inline',}},
{title: '出差单号',field: 'evectionCode',editable:{type:'text', }},
{title: '采购单号',field: 'purchaseCode',editable:{type:'text', }},
{title: '委外单号',field: 'outsourceCode',editable:{type:'text', }},
{
title: '操作',
align: 'center',

7
ruoyi-admin/src/main/resources/templates/system/baseExpense/confirmPayment.html

@ -25,9 +25,8 @@
<div class="form-group">
<label class="col-sm-3 control-label">报销方式:</label>
<div class="col-sm-6">
<select id="expenseMethod" name="expenseMethod" th:field="*{expenseMethod}"
class="form-control"
th:with="dictList=${@dict.getType('sys_base_expense_method')}" readonly >
<select id="expenseMethod" name="expenseMethod" th:field="*{expenseMethod}" class="form-control"
th:with="dictList=${@dict.getType('sys_base_expense_method')}" disabled >
<option th:each="dict : ${dictList}" th:text="${dict.dictLabel}" th:value="${dict.dictValue}"></option>
</select>
</div>
@ -35,7 +34,7 @@
<div class="form-group">
<label class="col-sm-3 control-label is-required">报销金额:</label>
<div class="col-sm-6">
<input name="amount" class="form-control" type="number" required/>
<input name="amount" th:field="*{amount}" class="form-control" type="number" readonly/>
</div>
</div>
<div class="form-group">

Loading…
Cancel
Save