Browse Source

[feat]采购管理

采购订单实体类数据表和mapper.xml层的相关方法新增结案原因字段;
采购订单前端页面新增结案功能和方法,只要不为已结案的时候才可以结案;
新增结案页面,结案原因为必填;
采购订单新增 加载采购订单结案弹窗和采购订单结案后端接口;
采购订单结案方法,同时更新采购订单的结案状态和应付账款的结案状态都为已结案
财务应付账款新增 根据关联编号查询财务应付账款方法
dev
liuxiaoxu 2 months ago
parent
commit
3416b84125
  1. 2
      ruoyi-admin/src/main/java/com/ruoyi/financial/domain/FinancialAccountsPayable.java
  2. 5
      ruoyi-admin/src/main/java/com/ruoyi/financial/mapper/FinancialAccountsPayableMapper.java
  3. 25
      ruoyi-admin/src/main/java/com/ruoyi/purchase/controller/PurchaseOrderController.java
  4. 13
      ruoyi-admin/src/main/java/com/ruoyi/purchase/domain/PurchaseOrder.java
  5. 5
      ruoyi-admin/src/main/java/com/ruoyi/purchase/service/IPurchaseOrderService.java
  6. 36
      ruoyi-admin/src/main/java/com/ruoyi/purchase/service/impl/PurchaseOrderServiceImpl.java
  7. 5
      ruoyi-admin/src/main/resources/mapper/financial/FinancialAccountsPayableMapper.xml
  8. 7
      ruoyi-admin/src/main/resources/mapper/purchase/PurchaseOrderMapper.xml
  9. 62
      ruoyi-admin/src/main/resources/templates/purchase/purchaseOrder/closePurchaseOrder.html
  10. 23
      ruoyi-admin/src/main/resources/templates/purchase/purchaseOrder/purchaseOrder.html

2
ruoyi-admin/src/main/java/com/ruoyi/financial/domain/FinancialAccountsPayable.java

@ -25,7 +25,7 @@ public class FinancialAccountsPayable extends BaseEntity
@Excel(name = "应付单号", sort = 1) @Excel(name = "应付单号", sort = 1)
private String accountsPayableCode; private String accountsPayableCode;
/** 付款状态 */ /** 付款状态(0待付款、1部分付款、2已结案) */
@Excel(name = "付款状态", sort = 2,dictType = "accounts_payable_status") @Excel(name = "付款状态", sort = 2,dictType = "accounts_payable_status")
private String accountsPayableStatus; private String accountsPayableStatus;

5
ruoyi-admin/src/main/java/com/ruoyi/financial/mapper/FinancialAccountsPayableMapper.java

@ -79,4 +79,9 @@ public interface FinancialAccountsPayableMapper
public List<FinancialAccountsPayable> selectFinancialAccountsPayableByCodes(String[] accountsPayableCodes); public List<FinancialAccountsPayable> selectFinancialAccountsPayableByCodes(String[] accountsPayableCodes);
public int updatePayableClosingStatusById(Long accountsPayableId); public int updatePayableClosingStatusById(Long accountsPayableId);
/**
* 根据关联编号查询财务应付账款
* */
FinancialAccountsPayable selectFinancialAccountsPayableByRelevanceCode(String relevanceCode);
} }

25
ruoyi-admin/src/main/java/com/ruoyi/purchase/controller/PurchaseOrderController.java

@ -398,4 +398,29 @@ public class PurchaseOrderController extends BaseController
List<SysUser> list = sysUserService.selectRoleToUserList("cgyRole,cgjlRole,cgzgRole"); List<SysUser> list = sysUserService.selectRoleToUserList("cgyRole,cgjlRole,cgzgRole");
return getDataTable(list); return getDataTable(list);
} }
/**
* 加载采购订单结案弹窗
*/
@GetMapping("/closePurchaseOrder/{purchaseOrderId}")
public String closePurchaseOrder(@PathVariable("purchaseOrderId") Long purchaseOrderId,ModelMap mmap){
PurchaseOrder purchaseOrder = purchaseOrderService.selectPurchaseOrderById(purchaseOrderId);
mmap.put("purchaseOrder", purchaseOrder);
return prefix + "/closePurchaseOrder";
}
/**
* 采购订单结案
* */
@RequiresPermissions("purchase:purchaseOrder:close")
@Log(title = "采购订单", businessType = BusinessType.UPDATE)
@PostMapping("/closePurchaseOrder")
@ResponseBody
public AjaxResult closePurchaseOrderSave(PurchaseOrder purchaseOrder){
return toAjax(purchaseOrderService.closePurchaseOrder(purchaseOrder));
}
} }

13
ruoyi-admin/src/main/java/com/ruoyi/purchase/domain/PurchaseOrder.java

@ -138,6 +138,10 @@ public class PurchaseOrder extends BaseEntity
/** 申请时间 */ /** 申请时间 */
private Date applyTime; private Date applyTime;
/** 用于应付账款结案的结案原因*/
private String closedReason;
private List<PurchaseOrderChild> purchaseOrderChildList; private List<PurchaseOrderChild> purchaseOrderChildList;
@ -447,6 +451,14 @@ public class PurchaseOrder extends BaseEntity
return applyTime; return applyTime;
} }
public String getClosedReason() {
return closedReason;
}
public void setClosedReason(String closedReason) {
this.closedReason = closedReason;
}
public List<PurchaseOrderChild> getPurchaseOrderChildList() { public List<PurchaseOrderChild> getPurchaseOrderChildList() {
return purchaseOrderChildList; return purchaseOrderChildList;
} }
@ -496,6 +508,7 @@ public class PurchaseOrder extends BaseEntity
.append("applyTitle", getApplyTitle()) .append("applyTitle", getApplyTitle())
.append("applyUser", getApplyUser()) .append("applyUser", getApplyUser())
.append("applyTime", getApplyTime()) .append("applyTime", getApplyTime())
.append("closedReason", getClosedReason())
.append("purchaseOrderChildList", getPurchaseOrderChildList()) .append("purchaseOrderChildList", getPurchaseOrderChildList())
.toString(); .toString();
} }

5
ruoyi-admin/src/main/java/com/ruoyi/purchase/service/IPurchaseOrderService.java

@ -130,4 +130,9 @@ public interface IPurchaseOrderService
* 通过采购订单号集合查询采购订单集合 * 通过采购订单号集合查询采购订单集合
* */ * */
List<PurchaseOrder> selectPurchaseOrderChildListByPurchaseCodeList(List<String> purchaseCodeList); List<PurchaseOrder> selectPurchaseOrderChildListByPurchaseCodeList(List<String> purchaseCodeList);
/**
* 采购订单结案
* */
int closePurchaseOrder(PurchaseOrder purchaseOrder);
} }

36
ruoyi-admin/src/main/java/com/ruoyi/purchase/service/impl/PurchaseOrderServiceImpl.java

@ -1505,6 +1505,42 @@ public class PurchaseOrderServiceImpl implements IPurchaseOrderService
} }
/**
* 采购订单结案
* */
@Transactional(rollbackFor = Exception.class)
@Override
public int closePurchaseOrder(PurchaseOrder purchaseOrder) {
String loginName = ShiroUtils.getLoginName();
String purchaseOrderCode = purchaseOrder.getPurchaseOrderCode();
FinancialAccountsPayable oldAccountsPayable = financialAccountsPayableMapper.selectFinancialAccountsPayableByRelevanceCode(purchaseOrderCode);
if (oldAccountsPayable == null){
throw new BusinessException("未查到关联的应付账款记录,请检查");
}
oldAccountsPayable.setAccountsPayableStatus("2");
oldAccountsPayable.setClosedReason(purchaseOrder.getClosedReason());
oldAccountsPayable.setUpdateBy(loginName);
oldAccountsPayable.setUpdateTime(new Date());
int updateAccountsPayableResult = financialAccountsPayableMapper.updateFinancialAccountsPayable(oldAccountsPayable);
if (updateAccountsPayableResult <= 0){
throw new BusinessException("应付账款结案失败");
}
purchaseOrder.setPaymentStatus("4");
purchaseOrder.setUpdateBy(loginName);
purchaseOrder.setUpdateTime(new Date());
int updateResult = purchaseOrderMapper.updatePurchaseOrder(purchaseOrder);
if (updateResult <= 0){
throw new BusinessException("采购订单结案失败");
}
return updateResult;
}
/** /**
* 提交采购订单详情 * 提交采购订单详情
* */ * */

5
ruoyi-admin/src/main/resources/mapper/financial/FinancialAccountsPayableMapper.xml

@ -75,6 +75,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
where accounts_payable_id = #{accountsPayableId} where accounts_payable_id = #{accountsPayableId}
</select> </select>
<select id="selectFinancialAccountsPayableByRelevanceCode" parameterType="String" resultMap="FinancialAccountsPayableResult">
<include refid="selectFinancialAccountsPayableVo"/>
where relevance_code = #{relevanceCode}
</select>
<insert id="insertFinancialAccountsPayable" parameterType="FinancialAccountsPayable" useGeneratedKeys="true" keyProperty="accountsPayableId"> <insert id="insertFinancialAccountsPayable" parameterType="FinancialAccountsPayable" useGeneratedKeys="true" keyProperty="accountsPayableId">
insert into financial_accounts_payable insert into financial_accounts_payable
<trim prefix="(" suffix=")" suffixOverrides=","> <trim prefix="(" suffix=")" suffixOverrides=",">

7
ruoyi-admin/src/main/resources/mapper/purchase/PurchaseOrderMapper.xml

@ -43,10 +43,11 @@
<result property="applyTitle" column="apply_title" /> <result property="applyTitle" column="apply_title" />
<result property="applyUser" column="apply_user" /> <result property="applyUser" column="apply_user" />
<result property="applyTime" column="apply_time" /> <result property="applyTime" column="apply_time" />
<result property="closedReason" column="closed_reason" />
</resultMap> </resultMap>
<sql id="selectPurchaseOrderVo"> <sql id="selectPurchaseOrderVo">
select purchase_order_id, purchase_order_code, purchase_plan_code, warehouse_storage_status, payment_status, supplier_code, supplier_name, material_sum, actual_purchase_sum, shared_inventory_occupancy_sum, refunds_exchanges_sum, storage_sum, notify_has_arrived_sum,noRmb_sum, rmb_sum, eceipt_type, arrived_time, stock_no, stock_name, receive_person, receive_person_phone, receive_address, purchase_buyer, use_status, audit_status, create_by, create_time, update_by, update_time, del_flag, instance_id, instance_type, submit_instance_id, cancel_instance_id, restore_instance_id, apply_title, apply_user, apply_time from purchase_order select purchase_order_id, purchase_order_code, purchase_plan_code, warehouse_storage_status, payment_status, supplier_code, supplier_name, material_sum, actual_purchase_sum, shared_inventory_occupancy_sum, refunds_exchanges_sum, storage_sum, notify_has_arrived_sum,noRmb_sum, rmb_sum, eceipt_type, arrived_time, stock_no, stock_name, receive_person, receive_person_phone, receive_address, purchase_buyer, use_status, audit_status, create_by, create_time, update_by, update_time, del_flag, instance_id, instance_type, submit_instance_id, cancel_instance_id, restore_instance_id, apply_title, apply_user, apply_time, closed_reason from purchase_order
</sql> </sql>
<select id="selectPurchaseOrderList" parameterType="PurchaseOrder" resultMap="PurchaseOrderResult"> <select id="selectPurchaseOrderList" parameterType="PurchaseOrder" resultMap="PurchaseOrderResult">
@ -146,6 +147,7 @@
<if test="applyTitle != null">apply_title,</if> <if test="applyTitle != null">apply_title,</if>
<if test="applyUser != null">apply_user,</if> <if test="applyUser != null">apply_user,</if>
<if test="applyTime != null">apply_time,</if> <if test="applyTime != null">apply_time,</if>
<if test="closedReason != null">closed_reason,</if>
</trim> </trim>
<trim prefix="values (" suffix=")" suffixOverrides=","> <trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="purchaseOrderCode != null">#{purchaseOrderCode},</if> <if test="purchaseOrderCode != null">#{purchaseOrderCode},</if>
@ -185,6 +187,7 @@
<if test="applyTitle != null">#{applyTitle},</if> <if test="applyTitle != null">#{applyTitle},</if>
<if test="applyUser != null">#{applyUser},</if> <if test="applyUser != null">#{applyUser},</if>
<if test="applyTime != null">#{applyTime},</if> <if test="applyTime != null">#{applyTime},</if>
<if test="closedReason != null">#{closedReason},</if>
</trim> </trim>
</insert> </insert>
@ -228,6 +231,7 @@
<if test="applyTitle != null">apply_title = #{applyTitle},</if> <if test="applyTitle != null">apply_title = #{applyTitle},</if>
<if test="applyUser != null">apply_user = #{applyUser},</if> <if test="applyUser != null">apply_user = #{applyUser},</if>
<if test="applyTime != null">apply_time = #{applyTime},</if> <if test="applyTime != null">apply_time = #{applyTime},</if>
<if test="closedReason != null">closed_reason = #{closedReason},</if>
</trim> </trim>
where purchase_order_id = #{purchaseOrderId} where purchase_order_id = #{purchaseOrderId}
</update> </update>
@ -273,6 +277,7 @@
<if test="applyTitle != null">apply_title = #{applyTitle},</if> <if test="applyTitle != null">apply_title = #{applyTitle},</if>
<if test="applyUser != null">apply_user = #{applyUser},</if> <if test="applyUser != null">apply_user = #{applyUser},</if>
<if test="applyTime != null">apply_time = #{applyTime},</if> <if test="applyTime != null">apply_time = #{applyTime},</if>
<if test="closedReason != null">closed_reason = #{closedReason},</if>
</trim> </trim>
where purchase_order_code = #{purchaseOrderCode} where purchase_order_code = #{purchaseOrderCode}
</update> </update>

62
ruoyi-admin/src/main/resources/templates/purchase/purchaseOrder/closePurchaseOrder.html

@ -0,0 +1,62 @@
<!DOCTYPE html>
<html lang="zh" xmlns:th="http://www.thymeleaf.org" >
<head>
<th:block th:include="include :: header('结案')" />
</head>
<body class="white-bg">
<div class="wrapper wrapper-content animated fadeInRight ibox-content">
<form class="form-horizontal m" id="form-purchaseOrder-closePurchaseOrder" th:object="${purchaseOrder}">
<input name="purchaseOrderId" th:field="*{purchaseOrderId}" type="hidden">
<div class="form-group">
<label class="col-sm-3 control-label">采购单号:</label>
<div class="col-sm-8">
<input name="purchaseOrderCode" th:field="*{purchaseOrderCode}" class="form-control" type="text" readonly>
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">打款结案状态:</label>
<div class="col-sm-8">
<select name="paymentStatus" class="form-control m-b" th:with="type=${@dict.getType('sys_pay_close')}" disabled>
<option th:each="dict : ${type}" th:text="${dict.dictLabel}" th:value="${dict.dictValue}" th:field="*{paymentStatus}"></option>
</select>
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label ">供应商ID:</label>
<div class="col-sm-8">
<input name="supplierCode" th:field="*{supplierCode}" class="form-control" type="text" readonly>
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">供应商名称:</label>
<div class="col-sm-8">
<input name="supplierName" th:field="*{supplierName}" class="form-control" type="text" readonly>
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label is-required">结案原因:</label>
<div class="col-sm-8">
<textarea name="closedReason" th:field="*{closedReason}" class="form-control" required></textarea>
</div>
</div>
</form>
</div>
<th:block th:include="include :: footer" />
<script th:inline="javascript">
var prefix = ctx + "purchase/purchaseOrder"
$("#form-purchaseOrder-closePurchaseOrder").validate({
focusCleanup: true
});
function submitHandler() {
if ($.validate.form()) {
$.operate.save(prefix + "/closePurchaseOrder", $('#form-purchaseOrder-closePurchaseOrder').serialize());
}
}
</script>
</body>
</html>

23
ruoyi-admin/src/main/resources/templates/purchase/purchaseOrder/purchaseOrder.html

@ -59,6 +59,9 @@
<a class="btn btn-success" onclick="exportExcel()" shiro:hasPermission="purchase:purchaseOrder:export"> <a class="btn btn-success" onclick="exportExcel()" shiro:hasPermission="purchase:purchaseOrder:export">
<i class="fa fa-download"></i> 导出 <i class="fa fa-download"></i> 导出
</a> </a>
<a class="btn btn-success" onclick="closePurchaseOrder()" shiro:hasPermission="purchase:purchaseOrder:close">
<i class="fa fa-plus"></i> 结案
</a>
</div> </div>
<div class="col-sm-12 select-table table-striped"> <div class="col-sm-12 select-table table-striped">
<table id="bootstrap-table"></table> <table id="bootstrap-table"></table>
@ -74,6 +77,8 @@
var restoreFlag = [[${@permission.hasPermi('purchase:purchaseOrder:restore')}]]; var restoreFlag = [[${@permission.hasPermi('purchase:purchaseOrder:restore')}]];
var addPurchaseStorageFlag = [[${@permission.hasPermi('purchase:purchaseOrder:addPurchaseStorage')}]]; var addPurchaseStorageFlag = [[${@permission.hasPermi('purchase:purchaseOrder:addPurchaseStorage')}]];
var closeFlag = [[${@permission.hasPermi('purchase:purchaseOrder:close')}]];
var warehouseStorageStatusDatas = [[${@dict.getType('warehouse_storage_status')}]]; var warehouseStorageStatusDatas = [[${@dict.getType('warehouse_storage_status')}]];
var paymentStatusDatas = [[${@dict.getType('sys_pay_close')}]]; var paymentStatusDatas = [[${@dict.getType('sys_pay_close')}]];
@ -238,8 +243,11 @@
//入库通知 //入库通知
actions.push('<a class=" ' + addPurchaseStorageFlag + ' " href="javascript:void(0)" onclick="addPurchaseStorage(\'' + row.purchaseOrderId + '\')"><i class="fa fa-edit"></i>入库通知</a>'); actions.push('<a class=" ' + addPurchaseStorageFlag + ' " href="javascript:void(0)" onclick="addPurchaseStorage(\'' + row.purchaseOrderId + '\')"><i class="fa fa-edit"></i>入库通知</a>');
} }
//打款结案状态(0待打款、1部分打款、2全部打款、3部分结案、4已结案)
// 已作废 if(row.paymentStatus != "4"){
//结案
actions.push('<a class=" ' + closeFlag + ' " href="javascript:void(0)" onclick="closePurchaseOrder(\'' + row.purchaseOrderId + '\')"><i class="fa fa-edit"></i>结案</a>');
}
} }
// 有流程实例id // 有流程实例id
if(row.useStatus=="2" && !row.restoreInstanceId){ if(row.useStatus=="2" && !row.restoreInstanceId){
@ -352,6 +360,17 @@
$.modal.open("详情", url); $.modal.open("详情", url);
} }
//结案
function closePurchaseOrder(purchaseOrderId) {
var url = prefix + "/closePurchaseOrder/" + purchaseOrderId;
$.modal.open("结案", url);
}
// 显示警告消息的通用函数
function showWarning(message) {
$.modal.msgWarning(message);
}
</script> </script>
</body> </body>
</html> </html>
Loading…
Cancel
Save