Browse Source

[fix] 销售管理

修改销售业务经理审核页面:新增和删除字段展示、新增选择设备列表展示
修改销售业务主管审核页面:新增和删除字段展示、新增选择设备列表展示
新增 根据售后通知单号查询售后通知单详情数据后端查询接口
修改售后通知单的提交方法,新增售后状态
修改售后页面,把字段的disabled改为required,解决后端拿不到值问题
dev
liuxiaoxu 7 months ago
parent
commit
25dee52123
  1. 21
      ruoyi-admin/src/main/java/com/ruoyi/sales/controller/SalesAftersalesNoticeController.java
  2. 5
      ruoyi-admin/src/main/java/com/ruoyi/sales/mapper/SalesAftersalesNoticeDetailMapper.java
  3. 5
      ruoyi-admin/src/main/java/com/ruoyi/sales/service/ISalesAftersalesNoticeDetailService.java
  4. 16
      ruoyi-admin/src/main/java/com/ruoyi/sales/service/impl/SalesAftersalesNoticeDetailServiceImpl.java
  5. 2
      ruoyi-admin/src/main/java/com/ruoyi/sales/service/impl/SalesAftersalesNoticeServiceImpl.java
  6. 9
      ruoyi-admin/src/main/resources/mapper/sales/SalesAftersalesNoticeDetailMapper.xml
  7. 1
      ruoyi-admin/src/main/resources/mapper/sales/SalesAftersalesNoticeMapper.xml
  8. 157
      ruoyi-admin/src/main/resources/templates/sales/afterSalesNotice/taskYwjlVerify.html
  9. 150
      ruoyi-admin/src/main/resources/templates/sales/afterSalesNotice/taskYwzgVerify.html
  10. 12
      ruoyi-admin/src/main/resources/templates/system/salesOrder/startAftersales.html

21
ruoyi-admin/src/main/java/com/ruoyi/sales/controller/SalesAftersalesNoticeController.java

@ -6,7 +6,9 @@ import java.util.List;
import com.ruoyi.aftersales.service.IAftersalesOrderService;
import com.ruoyi.process.general.service.IProcessService;
import com.ruoyi.quality.domain.VO.CheckoutMaterialVO;
import com.ruoyi.sales.domain.SalesAftersalesNoticeDetail;
import com.ruoyi.sales.domain.VO.SalesAftersalesNoticeVO;
import com.ruoyi.sales.service.ISalesAftersalesNoticeDetailService;
import com.ruoyi.system.domain.SysSalesOrder;
import com.ruoyi.system.domain.Vo.SelectAftersalesNoticeVO;
import com.ruoyi.system.service.ISysSalesOrderService;
@ -31,6 +33,7 @@ import com.ruoyi.common.core.page.TableDataInfo;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import javax.xml.bind.annotation.W3CDomHandler;
/**
* 售后通知单Controller
@ -62,6 +65,8 @@ public class SalesAftersalesNoticeController extends BaseController
@Autowired
private ISysSalesOrderService sysSalesOrderService;
@Autowired
private ISalesAftersalesNoticeDetailService noticeDetailService;
@RequiresPermissions("sales:afterSalesNotice:view")
@GetMapping()
@ -239,6 +244,18 @@ public class SalesAftersalesNoticeController extends BaseController
/**
* 根据售后通知单号查询售后通知单详情数据
* */
@ResponseBody
@PostMapping("/getAfterSalesNoticeDetailList")
public TableDataInfo getAfterSalesNoticeDetailList(SalesAftersalesNoticeDetail salesAftersalesNoticeDetail){
startPage();
List<SalesAftersalesNoticeDetail> list = noticeDetailService.selectAfterSalesNoticeDetailList(salesAftersalesNoticeDetail);
return getDataTable(list);
}
/**
* 修改售后通知单
*/
@ -298,4 +315,8 @@ public class SalesAftersalesNoticeController extends BaseController
}
}

5
ruoyi-admin/src/main/java/com/ruoyi/sales/mapper/SalesAftersalesNoticeDetailMapper.java

@ -74,4 +74,9 @@ public interface SalesAftersalesNoticeDetailMapper
* @return 结果
*/
public int restoreSalesAftersalesNoticeDetailById(Long aftersalesNoticeDetailId);
/**
* 根据售后通知单号查询售后通知单详情数据
* */
List<SalesAftersalesNoticeDetail> selectSalesAftersalesNoticeDetailListByCode(String aftersalesNoticeCode);
}

5
ruoyi-admin/src/main/java/com/ruoyi/sales/service/ISalesAftersalesNoticeDetailService.java

@ -72,4 +72,9 @@ public interface ISalesAftersalesNoticeDetailService
* @return
*/
int restoreSalesAftersalesNoticeDetailById(Long aftersalesNoticeDetailId);
/**
* 根据售后通知单号查询售后通知单详情数据
* */
List<SalesAftersalesNoticeDetail> selectAfterSalesNoticeDetailList(SalesAftersalesNoticeDetail salesAftersalesNoticeDetail);
}

16
ruoyi-admin/src/main/java/com/ruoyi/sales/service/impl/SalesAftersalesNoticeDetailServiceImpl.java

@ -3,6 +3,8 @@ package com.ruoyi.sales.service.impl;
import java.util.List;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.ShiroUtils;
import com.ruoyi.common.utils.StringUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ruoyi.sales.mapper.SalesAftersalesNoticeDetailMapper;
@ -16,6 +18,7 @@ import com.ruoyi.common.core.text.Convert;
* @author 刘晓旭
* @date 2024-07-22
*/
@Slf4j
@Service
public class SalesAftersalesNoticeDetailServiceImpl implements ISalesAftersalesNoticeDetailService
{
@ -123,4 +126,17 @@ public class SalesAftersalesNoticeDetailServiceImpl implements ISalesAftersalesN
{
return salesAftersalesNoticeDetailMapper.restoreSalesAftersalesNoticeDetailById(aftersalesNoticeDetailId);
}
/**
* 根据售后通知单号查询售后通知单详情数据
* */
@Override
public List<SalesAftersalesNoticeDetail> selectAfterSalesNoticeDetailList(SalesAftersalesNoticeDetail salesAftersalesNoticeDetail) {
String aftersalesNoticeCode = salesAftersalesNoticeDetail.getAftersalesNoticeCode();
if (StringUtils.isEmpty(aftersalesNoticeCode)){
log.warn("与售后通知单详情关联的售后通知单号为空:{}",aftersalesNoticeCode);
}
return salesAftersalesNoticeDetailMapper.selectSalesAftersalesNoticeDetailListByCode(aftersalesNoticeCode);
}
}

2
ruoyi-admin/src/main/java/com/ruoyi/sales/service/impl/SalesAftersalesNoticeServiceImpl.java

@ -240,6 +240,8 @@ public class SalesAftersalesNoticeServiceImpl implements ISalesAftersalesNoticeS
SalesAftersalesNotice salesAftersalesNotice = new SalesAftersalesNotice();
// 审核状态-待审核
salesAftersalesNotice.setAuditStatus("0");
//待派单
salesAftersalesNotice.setAftersalesStatus("0");
String aftersalesNoticeCode = redisCache.generateBillNo("SH");
salesAftersalesNotice.setApplyUser(user.getLoginName());
salesAftersalesNotice.setApplyTime(DateUtils.getNowDate());

9
ruoyi-admin/src/main/resources/mapper/sales/SalesAftersalesNoticeDetailMapper.xml

@ -47,7 +47,14 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<include refid="selectSalesAftersalesNoticeDetailVo"/>
where aftersales_notice_detail_id = #{aftersalesNoticeDetailId}
</select>
<select id="selectSalesAftersalesNoticeDetailListByCode" parameterType="String" resultMap="SalesAftersalesNoticeDetailResult">
<include refid="selectSalesAftersalesNoticeDetailVo"/>
where aftersales_notice_code = #{aftersalesNoticeCode}
</select>
<insert id="insertSalesAftersalesNoticeDetail" parameterType="SalesAftersalesNoticeDetail" useGeneratedKeys="true" keyProperty="aftersalesNoticeDetailId">
insert into sales_aftersales_notice_detail
<trim prefix="(" suffix=")" suffixOverrides=",">

1
ruoyi-admin/src/main/resources/mapper/sales/SalesAftersalesNoticeMapper.xml

@ -56,6 +56,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="enterpriseName != null and enterpriseName != ''"> and enterprise_name like concat('%', #{enterpriseName}, '%')</if>
<if test="params.beginUpdateTime != null and params.beginUpdateTime != '' and params.endUpdateTime != null and params.endUpdateTime != ''"> and update_time between #{params.beginUpdateTime} and #{params.endUpdateTime}</if>
</where>
order by create_time desc
</select>
<select id="selectSalesAftersalesNoticeById" parameterType="Long" resultMap="SalesAftersalesNoticeResult">

157
ruoyi-admin/src/main/resources/templates/sales/afterSalesNotice/taskYwjlVerify.html

@ -1,7 +1,7 @@
<!DOCTYPE html>
<html lang="zh" xmlns:th="http://www.thymeleaf.org" >
<head>
<th:block th:include="include :: header('修改售后通知单')" />
<th:block th:include="include :: header('售后通知单经理审批')" />
<th:block th:include="include :: datetimepicker-css" />
</head>
<body class="white-bg">
@ -22,44 +22,9 @@
<input name="salesOrderCode" th:field="*{salesOrderCode}" class="form-control" type="text">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">用户ID:</label>
<div class="col-sm-8">
<input name="userId" th:field="*{userId}" class="form-control" type="text">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">审核状态:</label>
<div class="col-sm-8">
<div class="radio-box" th:each="dict : ${@dict.getType('auditStatus')}">
<input type="radio" th:id="${'auditStatus_' + dict.dictCode}" name="auditStatus" th:value="${dict.dictValue}" th:field="*{auditStatus}">
<label th:for="${'auditStatus_' + dict.dictCode}" th:text="${dict.dictLabel}"></label>
</div>
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">售后状态:</label>
<div class="col-sm-8">
<div class="radio-box" th:each="dict : ${@dict.getType('sales_aftersales_status')}">
<input type="radio" th:id="${'aftersalesStatus_' + dict.dictCode}" name="aftersalesStatus" th:value="${dict.dictValue}" th:field="*{aftersalesStatus}">
<label th:for="${'aftersalesStatus_' + dict.dictCode}" th:text="${dict.dictLabel}"></label>
</div>
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">业务人员:</label>
<div class="col-sm-8">
<input name="businessMembers" th:field="*{businessMembers}" class="form-control" type="text">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">售后人员:</label>
<div class="col-sm-8">
<input name="aftersalesMembers" th:field="*{aftersalesMembers}" class="form-control" type="text">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">客户代码:</label>
<label class="col-sm-3 control-label">客户ID:</label>
<div class="col-sm-8">
<input name="enterpriseCode" th:field="*{enterpriseCode}" class="form-control" type="text">
</div>
@ -70,24 +35,6 @@
<input name="enterpriseName" th:field="*{enterpriseName}" class="form-control" type="text">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">物料数合计:</label>
<div class="col-sm-8">
<input name="materialSum" th:field="*{materialSum}" class="form-control" type="text">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">数量合计:</label>
<div class="col-sm-8">
<input name="enterpriseSum" th:field="*{enterpriseSum}" class="form-control" type="text">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">客户要求出发日期:</label>
<div class="col-sm-8">
<input name="startTime" th:field="*{startTime}" class="form-control" type="text">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">联系人:</label>
<div class="col-sm-8">
@ -106,6 +53,12 @@
<input name="companyAddress" th:field="*{companyAddress}" class="form-control" type="text">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">客户要求出发日期:</label>
<div class="col-sm-8">
<input name="startTime" th:field="*{startTime}" class="form-control" type="text">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">备注信息:</label>
<div class="col-sm-8">
@ -122,19 +75,31 @@
</select>
</div>
</div>
</form>
<div class="container">
<div class="row">
<div class="col-sm-12 select-table table-striped">
<h3 class="mb-4">选择设备</h3>
<table id="bootstrap-table"></table>
</div>
</div>
</div>
</div>
<th:block th:include="include :: footer" />
<th:block th:include="include :: datetimepicker-js" />
<script th:src="@{/js/activiti.js}"></script>
<script th:inline="javascript">
var prefix = ctx + "sales/afterSalesNotice";
var emergencyDegreeDatas = [[${@dict.getType('aftersales_emergency_degree')}]];
$("#form-afterSalesNotice-ywjl").validate({
focusCleanup: true
});
var afterSalesNotice = [[${formData}]]
function submitHandler() {
if ($.validate.form()) {
if ($('textarea[name="comment"]').val()) {
@ -150,6 +115,82 @@
minView: "month",
autoclose: true
});
$(function() {
var options = {
url: prefix + "/getAfterSalesNoticeDetailList",
modalName: "出货设备",
showColumns: false,
pagination: false,
showToggle: false,
showRefresh:false,
showSearch:false,
queryParams:queryParams,
columns: [{
checkbox: true
},
{
title: '料号',
field: 'materialNo',
},
{
title: '图片',
field: 'materialPhotourl',
},
{
title: '物料名称',
field: 'materialName',
},
{
title: '物料类型',
field: 'materialType',
},
{
title: '单位',
field: 'materialUnit',
},
{
title: '品牌',
field: 'materialBrand',
},
{
title: '描述',
field: 'materialDescribe',
},
{
title: '已出库数量',
field: 'shippedGoodsSum',
},
{
title: '设备SN',
field: 'snCode',
},
{
title: '售后问题',
field: 'aftersalesProblem',
},
{
title: '紧急程度',
field: 'emergencyDegree',
formatter: function(value, row, index) {
return $.table.selectDictLabel(emergencyDegreeDatas, value);
}
},
]
};
$.table.init(options);
})
function queryParams(params) {
var curParams = {
// 传递参数查询参数
aftersalesNoticeCode: afterSalesNotice.aftersalesNoticeCode
};
return curParams;
}
</script>
</body>
</html>

150
ruoyi-admin/src/main/resources/templates/sales/afterSalesNotice/taskYwzgVerify.html

@ -22,44 +22,9 @@
<input name="salesOrderCode" th:field="*{salesOrderCode}" class="form-control" type="text">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">用户ID:</label>
<div class="col-sm-8">
<input name="userId" th:field="*{userId}" class="form-control" type="text">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">审核状态:</label>
<div class="col-sm-8">
<div class="radio-box" th:each="dict : ${@dict.getType('auditStatus')}">
<input type="radio" th:id="${'auditStatus_' + dict.dictCode}" name="auditStatus" th:value="${dict.dictValue}" th:field="*{auditStatus}">
<label th:for="${'auditStatus_' + dict.dictCode}" th:text="${dict.dictLabel}"></label>
</div>
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">售后状态:</label>
<div class="col-sm-8">
<div class="radio-box" th:each="dict : ${@dict.getType('sales_aftersales_status')}">
<input type="radio" th:id="${'aftersalesStatus_' + dict.dictCode}" name="aftersalesStatus" th:value="${dict.dictValue}" th:field="*{aftersalesStatus}">
<label th:for="${'aftersalesStatus_' + dict.dictCode}" th:text="${dict.dictLabel}"></label>
</div>
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">业务人员:</label>
<div class="col-sm-8">
<input name="businessMembers" th:field="*{businessMembers}" class="form-control" type="text">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">售后人员:</label>
<div class="col-sm-8">
<input name="aftersalesMembers" th:field="*{aftersalesMembers}" class="form-control" type="text">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">客户代码:</label>
<label class="col-sm-3 control-label">客户ID:</label>
<div class="col-sm-8">
<input name="enterpriseCode" th:field="*{enterpriseCode}" class="form-control" type="text">
</div>
@ -70,24 +35,6 @@
<input name="enterpriseName" th:field="*{enterpriseName}" class="form-control" type="text">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">物料数合计:</label>
<div class="col-sm-8">
<input name="materialSum" th:field="*{materialSum}" class="form-control" type="text">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">数量合计:</label>
<div class="col-sm-8">
<input name="enterpriseSum" th:field="*{enterpriseSum}" class="form-control" type="text">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">客户要求出发日期:</label>
<div class="col-sm-8">
<input name="startTime" th:field="*{startTime}" class="form-control" type="text">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">联系人:</label>
<div class="col-sm-8">
@ -106,6 +53,12 @@
<input name="companyAddress" th:field="*{companyAddress}" class="form-control" type="text">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">客户要求出发日期:</label>
<div class="col-sm-8">
<input name="startTime" th:field="*{startTime}" class="form-control" type="text">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">备注信息:</label>
<div class="col-sm-8">
@ -122,15 +75,26 @@
</select>
</div>
</div>
</form>
<div class="container">
<div class="row">
<div class="col-sm-12 select-table table-striped">
<h3 class="mb-4">选择设备</h3>
<table id="bootstrap-table"></table>
</div>
</div>
</div>
</div>
<th:block th:include="include :: footer" />
<th:block th:include="include :: datetimepicker-js" />
<script th:src="@{/js/activiti.js}"></script>
<script th:inline="javascript">
var prefix = ctx + "sales/afterSalesNotice";
var emergencyDegreeDatas = [[${@dict.getType('aftersales_emergency_degree')}]];
var afterSalesNotice = [[${formData}]]
$("#form-afterSalesNotice-ywzg").validate({
focusCleanup: true
});
@ -150,6 +114,78 @@
minView: "month",
autoclose: true
});
$(function() {
var options = {
url: prefix + "/getAfterSalesNoticeDetailList",
modalName: "出货设备",
showColumns: false,
pagination: false,
showToggle: false,
showRefresh:false,
showSearch:false,
queryParams:queryParams,
columns: [{
checkbox: true
},
{
title: '料号',
field: 'materialNo',
},
{
title: '图片',
field: 'materialPhotourl',
},
{
title: '物料名称',
field: 'materialName',
},
{
title: '物料类型',
field: 'materialType',
},
{
title: '单位',
field: 'materialUnit',
},
{
title: '品牌',
field: 'materialBrand',
},
{
title: '描述',
field: 'materialDescribe',
},
{
title: '已出库数量',
field: 'shippedGoodsSum',
},
{
title: '设备SN',
field: 'snCode',
},
{
title: '售后问题',
field: 'aftersalesProblem',
},
{
title: '紧急程度',
field: 'emergencyDegree',
formatter: function(value, row, index) {
return $.table.selectDictLabel(emergencyDegreeDatas, value);
}
},
]
};
$.table.init(options);
})
function queryParams(params) {
var curParams = {
// 传递参数查询参数
aftersalesNoticeCode: afterSalesNotice.aftersalesNoticeCode
};
return curParams;
}
</script>
</body>
</html>

12
ruoyi-admin/src/main/resources/templates/system/salesOrder/startAftersales.html

@ -35,21 +35,21 @@
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">收货联系人:</label>
<label class="col-sm-3 control-label">联系人:</label>
<div class="col-sm-8">
<input name="customerDelivery" th:field="*{customerDelivery}" class="form-control" type="text" disabled>
<input name="customerDelivery" th:field="*{customerContact}" class="form-control" type="text" readonly>
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">收货电话:</label>
<label class="col-sm-3 control-label">联系人电话:</label>
<div class="col-sm-8">
<input name="deliveryPhone" th:field="*{deliveryPhone}" class="form-control" type="text" disabled>
<input name="deliveryPhone" th:field="*{contactNumber}" class="form-control" type="text" readonly>
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">收货地址:</label>
<label class="col-sm-3 control-label">公司地址:</label>
<div class="col-sm-8">
<input name="deliveryAddress" th:field="*{deliveryAddress}" class="form-control" type="text" disabled>
<input name="deliveryAddress" th:field="*{deliveryAddress}" class="form-control" type="text" readonly>
</div>
</div>
<div class="form-group">

Loading…
Cancel
Save