Browse Source

[fix]售后管理:

售后客诉通知
新增售后通知编辑页面
修复点击编辑客诉通知的时候,客户编号不能正常回显
修复点击编辑客诉通知的时候,生产订单号不能正常回显
修改客诉通知单列表查询数据为aftersales_complaint_notice表中的数据
修改编辑客诉通知单相关物料数据为aftersales_complaint_notice_detail表中的数据
新增语句根据aftersales_complaint_code查询aftersales_complaint_notice_detail表中的数据
新增语句根据aftersales_complaint_code删除aftersales_complaint_notice_detail表中的数据
修改原来的编辑接口
dev
liuxiaoxu 10 months ago
parent
commit
6e7d8f879b
  1. 21
      ruoyi-admin/src/main/java/com/ruoyi/aftersales/controller/AftersalesComplaintNoticeController.java
  2. 14
      ruoyi-admin/src/main/java/com/ruoyi/aftersales/domain/AftersalesComplaintNoticeDetail.java
  3. 15
      ruoyi-admin/src/main/java/com/ruoyi/aftersales/mapper/AftersalesComplaintNoticeDetailMapper.java
  4. 7
      ruoyi-admin/src/main/java/com/ruoyi/aftersales/service/IAftersalesComplaintNoticeDetailService.java
  5. 1
      ruoyi-admin/src/main/java/com/ruoyi/aftersales/service/IAftersalesComplaintNoticeService.java
  6. 128
      ruoyi-admin/src/main/java/com/ruoyi/aftersales/service/impl/AftersalesComplaintNoticeDetailServiceImpl.java
  7. 1
      ruoyi-admin/src/main/java/com/ruoyi/aftersales/service/impl/AftersalesComplaintNoticeServiceImpl.java
  8. 24
      ruoyi-admin/src/main/resources/mapper/aftersales/AftersalesComplaintNoticeDetailMapper.xml
  9. 2
      ruoyi-admin/src/main/resources/mapper/aftersales/AftersalesComplaintNoticeMapper.xml
  10. 24
      ruoyi-admin/src/main/resources/templates/aftersales/complaintNotice/add.html
  11. 19
      ruoyi-admin/src/main/resources/templates/aftersales/complaintNotice/complaintNotice.html
  12. 381
      ruoyi-admin/src/main/resources/templates/aftersales/complaintNotice/edit.html

21
ruoyi-admin/src/main/java/com/ruoyi/aftersales/controller/AftersalesComplaintNoticeController.java

@ -1,10 +1,12 @@
package com.ruoyi.aftersales.controller;
import java.util.Collections;
import java.util.List;
import com.ruoyi.aftersales.domain.AftersalesComplaintNoticeDetail;
import com.ruoyi.aftersales.domain.vo.AftersalesMaterialVO;
import com.ruoyi.aftersales.service.IAftersalesComplaintNoticeDetailService;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.manufacture.domain.MaterialRequisitionDetail;
import com.ruoyi.system.domain.SysCustomer;
import com.ruoyi.system.domain.SysMakeOrder;
@ -54,10 +56,10 @@ public class AftersalesComplaintNoticeController extends BaseController
@RequiresPermissions("aftersales:complaintNotice:list")
@PostMapping("/list")
@ResponseBody
public TableDataInfo list(AftersalesComplaintNoticeDetail complaintNoticeDetail)
public TableDataInfo list(AftersalesComplaintNotice complaintNotice)
{
startPage();
List<AftersalesComplaintNoticeDetail> list = complaintNoticeDetailService.selectAftersalesComplaintNoticeDetailList(complaintNoticeDetail);
List<AftersalesComplaintNotice> list = aftersalesComplaintNoticeService.selectAftersalesComplaintNoticeList(complaintNotice);
return getDataTable(list);
}
@ -114,9 +116,9 @@ public class AftersalesComplaintNoticeController extends BaseController
@Log(title = "售后客诉通知单", businessType = BusinessType.UPDATE)
@PostMapping("/edit")
@ResponseBody
public AjaxResult editSave(AftersalesComplaintNotice aftersalesComplaintNotice)
public AjaxResult editSave(@RequestBody AftersalesComplaintNoticeDetail aftersalesComplaintNoticeDetail)
{
return toAjax(aftersalesComplaintNoticeService.updateAftersalesComplaintNotice(aftersalesComplaintNotice));
return toAjax(complaintNoticeDetailService.updateAftersalesComplaintNoticeDetail(aftersalesComplaintNoticeDetail));
}
/**
@ -163,4 +165,15 @@ public class AftersalesComplaintNoticeController extends BaseController
return getDataTable(list);
}
/**
* 编辑操作的时候查询数据库中已有的物料信息
* */
@ResponseBody
@PostMapping("/getMaterialListByNoticeCode")
public TableDataInfo getMaterialListByNoticeCode(AftersalesComplaintNoticeDetail complaintNoticeDetail){
startPage();
List<AftersalesMaterialVO> list = complaintNoticeDetailService.selectMaterialListByNoticeCode(complaintNoticeDetail.getComplaintNoticeCode());
return getDataTable(list);
}
}

14
ruoyi-admin/src/main/java/com/ruoyi/aftersales/domain/AftersalesComplaintNoticeDetail.java

@ -1,10 +1,13 @@
package com.ruoyi.aftersales.domain;
import com.ruoyi.aftersales.domain.vo.AftersalesMaterialVO;
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.List;
/**
* 售后客诉通知单详情对象 aftersales_complaint_notice_detail
*
@ -106,6 +109,8 @@ public class AftersalesComplaintNoticeDetail extends BaseEntity
/** 数量合计 */
private String enterpriseSum;
/** 客诉通知相关物料数据 */
private List<AftersalesMaterialVO> aftersalesMaterialVOs;
public void setComplaintNoticeDetailId(Long complaintNoticeDetailId)
{
this.complaintNoticeDetailId = complaintNoticeDetailId;
@ -341,6 +346,14 @@ public class AftersalesComplaintNoticeDetail extends BaseEntity
return enterpriseSum;
}
public List<AftersalesMaterialVO> getAftersalesMaterialVOs() {
return aftersalesMaterialVOs;
}
public void setAftersalesMaterialVOs(List<AftersalesMaterialVO> aftersalesMaterialVOs) {
this.aftersalesMaterialVOs = aftersalesMaterialVOs;
}
@Override
public String toString() {
return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
@ -375,6 +388,7 @@ public class AftersalesComplaintNoticeDetail extends BaseEntity
.append("updateBy", getUpdateBy())
.append("updateTime", getUpdateTime())
.append("remark", getRemark())
.append("aftersalesMaterialVOs",getAftersalesMaterialVOs())
.toString();
}
}

15
ruoyi-admin/src/main/java/com/ruoyi/aftersales/mapper/AftersalesComplaintNoticeDetailMapper.java

@ -64,6 +64,15 @@ public interface AftersalesComplaintNoticeDetailMapper
*/
public int deleteAftersalesComplaintNoticeDetailByIds(String[] complaintNoticeDetailIds);
/**
* 删除售后客诉通知单详情
*
* @param complaintNoticeCode 售后客诉通知单号
* @return 结果
*/
public int deleteAftersalesComplaintNoticeDetailByCode(String complaintNoticeCode);
/**
* 作废售后客诉通知单详情
*
@ -85,4 +94,10 @@ public interface AftersalesComplaintNoticeDetailMapper
* @return 最大序号
*/
String maxRoundCode(@Param("code") String code);
/**
* 查找与客诉通知单号有关的物料信息
* @param complainNoticeCode
* */
List<AftersalesComplaintNoticeDetail> selectMaterialListByNoticeCode(String complainNoticeCode);
}

7
ruoyi-admin/src/main/java/com/ruoyi/aftersales/service/IAftersalesComplaintNoticeDetailService.java

@ -2,6 +2,7 @@ package com.ruoyi.aftersales.service;
import java.util.List;
import com.ruoyi.aftersales.domain.AftersalesComplaintNoticeDetail;
import com.ruoyi.aftersales.domain.vo.AftersalesMaterialVO;
/**
* 售后客诉通知单详情Service接口
@ -72,4 +73,10 @@ public interface IAftersalesComplaintNoticeDetailService
* @return
*/
int restoreAftersalesComplaintNoticeDetailById(Long complaintNoticeDetailId);
/**
* 查找与客诉通知单号有关的物料信息
* @param complainNoticeCode
* */
List<AftersalesMaterialVO> selectMaterialListByNoticeCode(String complainNoticeCode);
}

1
ruoyi-admin/src/main/java/com/ruoyi/aftersales/service/IAftersalesComplaintNoticeService.java

@ -89,4 +89,5 @@ public interface IAftersalesComplaintNoticeService
* @param makeNo
* */
List<AftersalesMaterialVO> selectMaterialInfoByMakeNo(String makeNo);
}

128
ruoyi-admin/src/main/java/com/ruoyi/aftersales/service/impl/AftersalesComplaintNoticeDetailServiceImpl.java

@ -2,11 +2,18 @@ package com.ruoyi.aftersales.service.impl;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import com.ruoyi.aftersales.domain.AftersalesComplaintNotice;
import com.ruoyi.aftersales.domain.vo.AftersalesMaterialVO;
import com.ruoyi.aftersales.mapper.AftersalesComplaintNoticeMapper;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.ShiroUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.system.domain.SysMakeorderBom;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ruoyi.aftersales.mapper.AftersalesComplaintNoticeDetailMapper;
@ -21,12 +28,16 @@ import org.springframework.transaction.annotation.Transactional;
* @author 刘晓旭
* @date 2024-04-25
*/
@Slf4j
@Service
public class AftersalesComplaintNoticeDetailServiceImpl implements IAftersalesComplaintNoticeDetailService
{
@Autowired
private AftersalesComplaintNoticeDetailMapper aftersalesComplaintNoticeDetailMapper;
@Autowired
private AftersalesComplaintNoticeMapper complaintNoticeMapper;
/**
* 查询售后客诉通知单详情
*
@ -61,7 +72,7 @@ public class AftersalesComplaintNoticeDetailServiceImpl implements IAftersalesCo
@Override
public int insertAftersalesComplaintNoticeDetail(AftersalesComplaintNoticeDetail complaintNoticeDetail)
{
AftersalesComplaintNotice complaintNotice = new AftersalesComplaintNotice();
SimpleDateFormat df = new SimpleDateFormat("yyyyMMdd");
String code = "KS"+df.format(new Date());
//模糊查询当前最大的编码
@ -79,7 +90,36 @@ public class AftersalesComplaintNoticeDetailServiceImpl implements IAftersalesCo
String loginName = ShiroUtils.getLoginName();
complaintNoticeDetail.setCreateBy(loginName);
complaintNoticeDetail.setCreateTime(DateUtils.getNowDate());
return aftersalesComplaintNoticeDetailMapper.insertAftersalesComplaintNoticeDetail(complaintNoticeDetail);
//保存信息到AftersalesComplaintNotice数据表中
complaintNotice.setComplaintNoticeCode(newCode);
complaintNotice.setCreateBy(loginName);
complaintNotice.setCreateTime(new Date());
complaintNotice.setMakeNo(complaintNoticeDetail.getMakeNo());
complaintNotice.setCustomerId(complaintNoticeDetail.getCustomerId());
complaintNotice.setCustomerName(complaintNoticeDetail.getCustomerName());
complaintNotice.setEmergencyDegree(complaintNoticeDetail.getEmergencyDegree());
complaintNoticeMapper.insertAftersalesComplaintNotice(complaintNotice);
List<AftersalesMaterialVO> aftersalesMaterialVOs = complaintNoticeDetail.getAftersalesMaterialVOs();
if (StringUtils.isEmpty(aftersalesMaterialVOs)){
return aftersalesComplaintNoticeDetailMapper.insertAftersalesComplaintNoticeDetail(complaintNoticeDetail);
}
for (AftersalesMaterialVO aftersalesMaterialVO : aftersalesMaterialVOs) {
complaintNoticeDetail.setMaterialType(aftersalesMaterialVO.getMaterialType());
complaintNoticeDetail.setMaterialUnit(aftersalesMaterialVO.getMaterialUnit());
complaintNoticeDetail.setMaterialProcessMethod(aftersalesMaterialVO.getMaterialProcessMethod());
complaintNoticeDetail.setMaterialName(aftersalesMaterialVO.getMaterialName());
complaintNoticeDetail.setMaterialDescribe(aftersalesMaterialVO.getMaterialDescribe());
complaintNoticeDetail.setMaterialNo(aftersalesMaterialVO.getMaterialNo());
complaintNoticeDetail.setMaterialPhotourl(aftersalesMaterialVO.getMaterialPhotourl());
complaintNoticeDetail.setMaterialBrand(aftersalesMaterialVO.getMaterialBrand());
complaintNoticeDetail.setComplaintProblem(aftersalesMaterialVO.getComplaintProblem());
complaintNoticeDetail.setSnCode(aftersalesMaterialVO.getSnCode());
complaintNoticeDetail.setAdverseReportUrl(aftersalesMaterialVO.getAdverseReportUrl());
aftersalesComplaintNoticeDetailMapper.insertAftersalesComplaintNoticeDetail(complaintNoticeDetail);
}
return 1;
}
/**
@ -88,13 +128,58 @@ public class AftersalesComplaintNoticeDetailServiceImpl implements IAftersalesCo
* @param aftersalesComplaintNoticeDetail 售后客诉通知单详情
* @return 结果
*/
@Transactional
@Override
public int updateAftersalesComplaintNoticeDetail(AftersalesComplaintNoticeDetail aftersalesComplaintNoticeDetail)
{
AftersalesComplaintNotice aftersalesComplaintNotice = new AftersalesComplaintNotice();
String loginName = ShiroUtils.getLoginName();
aftersalesComplaintNoticeDetail.setUpdateBy(loginName);
aftersalesComplaintNoticeDetail.setUpdateTime(DateUtils.getNowDate());
return aftersalesComplaintNoticeDetailMapper.updateAftersalesComplaintNoticeDetail(aftersalesComplaintNoticeDetail);
//更新主表内容
aftersalesComplaintNotice.setComplaintNoticeCode(aftersalesComplaintNoticeDetail.getComplaintNoticeCode());
aftersalesComplaintNotice.setUpdateBy(loginName);
aftersalesComplaintNotice.setUpdateTime(new Date());
aftersalesComplaintNotice.setMakeNo(aftersalesComplaintNoticeDetail.getMakeNo());
aftersalesComplaintNotice.setEmergencyDegree(aftersalesComplaintNoticeDetail.getEmergencyDegree());
aftersalesComplaintNotice.setRemark(aftersalesComplaintNoticeDetail.getRemark());
aftersalesComplaintNotice.setCustomerName(aftersalesComplaintNoticeDetail.getCustomerName());
aftersalesComplaintNotice.setCustomerId(aftersalesComplaintNoticeDetail.getCustomerId());
complaintNoticeMapper.updateAftersalesComplaintNotice(aftersalesComplaintNotice);
String complaintNoticeCode = aftersalesComplaintNoticeDetail.getComplaintNoticeCode();
List<AftersalesMaterialVO> aftersalesMaterialVOs = aftersalesComplaintNoticeDetail.getAftersalesMaterialVOs();
//如果前面相关物料信息为空
if (StringUtils.isEmpty(aftersalesMaterialVOs)){
//删除子表中的数据
int result = aftersalesComplaintNoticeDetailMapper.deleteAftersalesComplaintNoticeDetailByCode(complaintNoticeCode);
return result;
}
//如果有物料信息
int result = aftersalesComplaintNoticeDetailMapper.deleteAftersalesComplaintNoticeDetailByCode(complaintNoticeCode);
for (AftersalesMaterialVO aftersalesMaterialVO : aftersalesMaterialVOs) {
AftersalesComplaintNoticeDetail complaintNoticeDetail = new AftersalesComplaintNoticeDetail();
complaintNoticeDetail.setComplaintNoticeCode(complaintNoticeCode);
complaintNoticeDetail.setCreateBy(aftersalesComplaintNoticeDetail.getCreateBy());
complaintNoticeDetail.setCreateTime(aftersalesComplaintNoticeDetail.getCreateTime());
complaintNoticeDetail.setUpdateBy(loginName);
complaintNoticeDetail.setUpdateTime(new Date());
complaintNoticeDetail.setCustomerId(aftersalesComplaintNoticeDetail.getCustomerId());
complaintNoticeDetail.setCustomerName(aftersalesComplaintNoticeDetail.getCustomerName());
complaintNoticeDetail.setEmergencyDegree(aftersalesComplaintNoticeDetail.getEmergencyDegree());
complaintNoticeDetail.setMakeNo(aftersalesComplaintNoticeDetail.getMakeNo());
complaintNoticeDetail.setRemark(aftersalesComplaintNoticeDetail.getRemark());
complaintNoticeDetail.setMaterialType(aftersalesMaterialVO.getMaterialType());
complaintNoticeDetail.setMaterialUnit(aftersalesMaterialVO.getMaterialUnit());
complaintNoticeDetail.setMaterialProcessMethod(aftersalesMaterialVO.getMaterialProcessMethod());
complaintNoticeDetail.setMaterialName(aftersalesMaterialVO.getMaterialName());
complaintNoticeDetail.setMaterialDescribe(aftersalesMaterialVO.getMaterialDescribe());
complaintNoticeDetail.setMaterialNo(aftersalesMaterialVO.getMaterialNo());
complaintNoticeDetail.setMaterialPhotourl(aftersalesMaterialVO.getMaterialPhotourl());
complaintNoticeDetail.setMaterialBrand(aftersalesMaterialVO.getMaterialBrand());
complaintNoticeDetail.setComplaintProblem(aftersalesMaterialVO.getComplaintProblem());
complaintNoticeDetail.setSnCode(aftersalesMaterialVO.getSnCode());
complaintNoticeDetail.setAdverseReportUrl(aftersalesMaterialVO.getAdverseReportUrl());
aftersalesComplaintNoticeDetailMapper.insertAftersalesComplaintNoticeDetail(complaintNoticeDetail);
}
return 1;
}
/**
@ -145,6 +230,39 @@ public class AftersalesComplaintNoticeDetailServiceImpl implements IAftersalesCo
return aftersalesComplaintNoticeDetailMapper.restoreAftersalesComplaintNoticeDetailById(complaintNoticeDetailId);
}
/**
* 查找与客诉通知单号有关的物料信息
* @param complainNoticeCode
* */
@Override
public List<AftersalesMaterialVO> selectMaterialListByNoticeCode(String complainNoticeCode) {
ArrayList<AftersalesMaterialVO> aftersalesMaterialVOs = new ArrayList<>();
List<AftersalesComplaintNoticeDetail> complaintNoticeDetails=aftersalesComplaintNoticeDetailMapper.selectMaterialListByNoticeCode(complainNoticeCode);
if (StringUtils.isEmpty(complaintNoticeDetails)){
// 记录日志
log.warn("未查找到与客诉通知单号关联的物料相关数据, 客诉通知号: {}", complainNoticeCode);
}
for (AftersalesComplaintNoticeDetail complaintNoticeDetail : complaintNoticeDetails) {
AftersalesMaterialVO aftersalesMaterialVO = new AftersalesMaterialVO();
aftersalesMaterialVO.setMaterialNo(complaintNoticeDetail.getMaterialNo());
aftersalesMaterialVO.setMaterialBrand(complaintNoticeDetail.getMaterialBrand());
aftersalesMaterialVO.setMaterialDescribe(complaintNoticeDetail.getMaterialDescribe());
aftersalesMaterialVO.setMaterialName(complaintNoticeDetail.getMaterialName());
aftersalesMaterialVO.setMaterialProcessMethod(complaintNoticeDetail.getMaterialProcessMethod());
aftersalesMaterialVO.setMaterialPhotourl(complaintNoticeDetail.getMaterialPhotourl());
aftersalesMaterialVO.setMaterialUnit(complaintNoticeDetail.getMaterialUnit());
aftersalesMaterialVO.setMaterialType(complaintNoticeDetail.getMaterialType());
aftersalesMaterialVO.setComplaintProblem(complaintNoticeDetail.getComplaintProblem());
aftersalesMaterialVO.setSnCode(complaintNoticeDetail.getSnCode());
aftersalesMaterialVO.setAdverseReportUrl(complaintNoticeDetail.getAdverseReportUrl());
aftersalesMaterialVOs.add(aftersalesMaterialVO);
}
return aftersalesMaterialVOs;
}
/**
*客诉单号生成规则:

1
ruoyi-admin/src/main/java/com/ruoyi/aftersales/service/impl/AftersalesComplaintNoticeServiceImpl.java

@ -184,6 +184,7 @@ public class AftersalesComplaintNoticeServiceImpl implements IAftersalesComplain
@Override
public List<AftersalesMaterialVO> selectMaterialInfoByMakeNo(String makeNo) {
ArrayList<AftersalesMaterialVO> aftersalesMaterialVOs = new ArrayList<>();
List<SysMakeorderBom> sysMakeorderBoms = sysMakeorderBomMapper.selectSysMakeorderBomByMakeNo(makeNo);
if (StringUtils.isEmpty(sysMakeorderBoms)){
// 记录日志

24
ruoyi-admin/src/main/resources/mapper/aftersales/AftersalesComplaintNoticeDetailMapper.xml

@ -40,6 +40,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<sql id="selectAftersalesComplaintNoticeDetailVo">
select complaint_notice_detail_id, complaint_notice_code, make_no, user_id, delivery_goods_num, emergency_degree, complaint_problem, closing_procedures, adverse_report_url, customer_id, customer_name, device_model_code, device_model_name, sn_code, device_running_number, material_no, material_name, material_type, material_photoUrl, material_brand, material_unit, material_describe, material_process_method, shipped_goods_sum, material_sum, enterprise_sum, create_by, create_time, update_by, update_time, remark from aftersales_complaint_notice_detail
</sql>
<select id="selectAftersalesComplaintNoticeDetailList" parameterType="AftersalesComplaintNoticeDetail"
resultMap="AftersalesComplaintNoticeDetailResult">
<include refid="selectAftersalesComplaintNoticeDetailVo"/>
<where>
<if test="complaintNoticeCode != null and complaintNoticeCode != ''"> and complaint_notice_code = #{complaintNoticeCode}</if>
<if test="makeNo != null and makeNo != ''"> and make_no = #{makeNo}</if>
@ -49,18 +55,18 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="materialName != null and materialName != ''"> and material_name like concat('%', #{materialName}, '%')</if>
<if test="params.beginCreateTime != null and params.beginCreateTime != '' and params.endCreateTime != null and params.endCreateTime != ''"> and create_time between #{params.beginCreateTime} and #{params.endCreateTime}</if>
</where>
</sql>
<select id="selectAftersalesComplaintNoticeDetailList" parameterType="AftersalesComplaintNoticeDetail"
resultMap="AftersalesComplaintNoticeDetailResult">
<include refid="selectAftersalesComplaintNoticeDetailVo"/>
</select>
<select id="selectAftersalesComplaintNoticeDetailById" parameterType="Long" resultMap="AftersalesComplaintNoticeDetailResult">
<include refid="selectAftersalesComplaintNoticeDetailVo"/>
where complaint_notice_detail_id = #{complaintNoticeDetailId}
</select>
<select id="selectMaterialListByNoticeCode" resultType="String" resultMap="AftersalesComplaintNoticeDetailResult">
<include refid="selectAftersalesComplaintNoticeDetailVo"/>
where complaint_notice_code = #{complaintNoticeCode}
</select>
<insert id="insertAftersalesComplaintNoticeDetail" parameterType="AftersalesComplaintNoticeDetail" useGeneratedKeys="true" keyProperty="complaintNoticeDetailId">
insert into aftersales_complaint_notice_detail
<trim prefix="(" suffix=")" suffixOverrides=",">
@ -177,6 +183,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
</foreach>
</delete>
<delete id="deleteAftersalesComplaintNoticeDetailByCode" parameterType="String">
delete from aftersales_complaint_notice_detail where complaint_notice_code = #{complaintNoticeCode}
</delete>
<update id="cancelAftersalesComplaintNoticeDetailById" parameterType="Long">
update aftersales_complaint_notice_detail set del_flag = '1' where complaint_notice_detail_id = #{complaintNoticeDetailId}
</update>
@ -189,4 +200,5 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<select id="maxRoundCode" resultType="String">
SELECT max(complaint_notice_code) from aftersales_complaint_notice_detail where complaint_notice_code like concat(#{code},'%')
</select>
</mapper>

2
ruoyi-admin/src/main/resources/mapper/aftersales/AftersalesComplaintNoticeMapper.xml

@ -115,7 +115,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="updateTime != null">update_time = #{updateTime},</if>
<if test="remark != null">remark = #{remark},</if>
</trim>
where complaint_notice_id = #{complaintNoticeId}
where complaint_notice_code = #{complaintNoticeCode}
</update>
<delete id="deleteAftersalesComplaintNoticeById" parameterType="Long">

24
ruoyi-admin/src/main/resources/templates/aftersales/complaintNotice/add.html

@ -74,12 +74,21 @@
// 新增提交
function submitHandler() {
// 获取表单数据
const complaintNoticeData = $("#form-complaintNotice-add").serializeArray();
// 获取bootstrap-table的数据,这里假设你使用bootstrap-table的API获取所有数据
const complaintNoticeData = $("#form-complaintNotice-add").serializeArray().reduce((obj, item) => {
obj[item.name] = item.value;
return obj;
}, {});
// 获取bootstrap-table的数据,这里假设你使用bootstrap-table的API获取所有数据
var table = $('#bootstrap-table').bootstrapTable('getData');
// 检查表格数据是否为空
if (table.length===0){
$.modal.alertWarning("请至少添加一条物料数据后再保存!");
return;
}
console.log(table);
// 将表数据转换成与complaintNoticeData格式一致的数组
var materialData = table.map(function(item) {
var materialDataList = table.map(function(item) {
// 根据实际字段名调整
return {
"materialNo": item.materialNo, // 假设id对应materialId
@ -97,8 +106,9 @@
};
});
const combinedData = Object.assign({}, complaintNoticeData, { aftersalesMaterialVOs: materialDataList });
// 合并表单数据和表格数据
const combinedData = Object.assign({}, ...complaintNoticeData.map(item => ({ [item.name]: item.value })), ...materialData);
// const combinedData = Object.assign({}, ...complaintNoticeData.array(item => ({ [item.name]: item.value })), ...materialData);
console.log(combinedData)
// 使用 JSON.stringify() 序列化数据
const jsonData = JSON.stringify(combinedData);
@ -126,13 +136,13 @@
// 将获取到的客户名称填充到输入框
if(data.data == null){
// 如果返回的数据有问题,可以给出提示或处理
alert('未能获取到客户名称!');
$.modal.msgError("未能获取到客户名称!");
}
$('input[name="customerName"]').val(data.data.customerName);
},
error: function(jqXHR, textStatus, errorThrown) {
console.error('Error:', textStatus, errorThrown);
alert('查询客户名称时发生错误!');
$.modal.msgError("查询客户名称时发生错误!");
}
});
} else {
@ -220,7 +230,7 @@
function insertRow() {
var selectedMakeNo = $("#makeNo").val();
if (!selectedMakeNo) {
alert("请先选择生产单号。");
$.modal.alertWarning("请先选择生产单号。");
return;
}
var encodedMakeNo = encodeURIComponent(selectedMakeNo);

19
ruoyi-admin/src/main/resources/templates/aftersales/complaintNotice/complaintNotice.html

@ -92,7 +92,7 @@
checkbox: true
},
{
title: '客诉通知ID',
title: '客诉通知详情ID',
field: 'complaintNoticeId',
visible: false
},
@ -150,18 +150,23 @@
formatter: function(value, row, index) {
var actions = [];
actions.push('<a class="btn btn-success btn-xs ' + editFlag + '" href="javascript:void(0)" onclick="$.operate.edit(\'' + row.complaintNoticeId + '\')"><i class="fa fa-edit"></i>编辑</a> ');
// actions.push('<a class="btn btn-danger btn-xs ' + removeFlag + '" href="javascript:void(0)" onclick="$.operate.remove(\'' + row.complaintNoticeId + '\')"><i class="fa fa-remove"></i>删除</a> ');
// if(row.delFlag == '0'){
// actions.push('<a class="btn btn-danger btn-xs ' + cancelFlag + '" href="javascript:void(0)" onclick="$.operate.cancel(\'' + row.id + '\')"><i class="fa fa-remove"></i>作废</a> ');
// }else{
// actions.push('<a class="btn btn-success btn-xs ' + restoreFlag + '" href="javascript:void(0)" onclick="$.operate.restore(\'' + row.id + '\')"><i class="fa fa-window-restore"></i>恢复</a> ');
// }
return actions.join('');
}
}]
};
$.table.init(options);
});
/*详情*/
// function detail(aftersalesOrderId) {
// // 在这里编写派单操作的逻辑,使用传入的aftersalesOrderId参数
// // 示例逻辑:
// var url = ctx + 'aftersales/aftersalesOrder/detail/'+aftersalesOrderId;
// console.log(url);
// $.modal.open("上传报告",url);
// }
</script>
</body>
</html>

381
ruoyi-admin/src/main/resources/templates/aftersales/complaintNotice/edit.html

@ -6,27 +6,31 @@
<body class="white-bg">
<div class="wrapper wrapper-content animated fadeInRight ibox-content">
<form class="form-horizontal m" id="form-complaintNotice-edit" th:object="${aftersalesComplaintNotice}">
<input name="complaintNoticeId" th:field="*{complaintNoticeId}" type="hidden">
<div class="form-group">
<label class="col-sm-3 control-label">客诉单号:</label>
<input name="complaintNoticeCode" th:field="*{complaintNoticeCode}" type="hidden">
<div class="form-group">
<label class="col-sm-4 control-label">客户编号:</label>
<div class="col-sm-8">
<input name="complaintNoticeCode" th:field="*{complaintNoticeCode}" class="form-control" type="text">
<select class="form-control" id="customerId" name="customerId" th:field="*{customerId}" onchange="loadMakeNos()" required>
<!-- 这里动态生成客户编号选项 -->
</select>
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">关联生产单号</label>
<div class="form-group">
<label class="col-sm-4 control-label">客户名称</label>
<div class="col-sm-8">
<input name="makeNo" th:field="*{makeNo}" class="form-control" type="text">
<input name="customerName" th:field="*{customerName}" class="form-control" type="text" readonly>
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">用户ID</label>
<div class="form-group">
<label class="col-sm-4 control-label">生产单号</label>
<div class="col-sm-8">
<input name="userId" th:field="*{userId}" class="form-control" type="text">
<select class="form-control" id="makeNo" name="makeNo" th:field="*{makeNo}" required>
<!-- 这里动态生成生产单号选项 -->
</select>
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">紧急程度:</label>
<label class="col-sm-4 control-label">紧急程度:</label>
<div class="col-sm-8">
<select name="emergencyDegree" class="form-control m-b" th:with="type=${@dict.getType('aftersales_emergency_degree')}">
<option th:each="dict : ${type}" th:text="${dict.dictLabel}" th:value="${dict.dictValue}" th:field="*{emergencyDegree}"></option>
@ -34,75 +38,326 @@
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">是否结案</label>
<label class="col-sm-4 control-label">备注信息</label>
<div class="col-sm-8">
<select name="closingProcedures" class="form-control m-b" th:with="type=${@dict.getType('aftersales_closing_procedures')}">
<option th:each="dict : ${type}" th:text="${dict.dictLabel}" th:value="${dict.dictValue}" th:field="*{closingProcedures}"></option>
</select>
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">客户ID:</label>
<div class="col-sm-8">
<input name="customerId" th:field="*{customerId}" 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="customerName" th:field="*{customerName}" 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="materialNo" th:field="*{materialNo}" 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="materialName" th:field="*{materialName}" 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">
<input name="remark" th:field="*{remark}" 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="deliveryGoodsNum" th:field="*{deliveryGoodsNum}" class="form-control" type="text">
</form>
<div class="container">
<div class="form-row">
<div class="btn-group-sm" id="toolbar" role="group">
<span>选择物料</span>
<a class="btn btn-success" onclick="insertRow()">
<i class="fa fa-plus"></i> 选择物料
</a>
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">备注信息:</label>
<div class="col-sm-8">
<input name="remark" th:field="*{remark}" class="form-control" type="text">
<div class="row">
<div class="col-sm-12 select-table table-striped">
<table id="bootstrap-table"></table>
</div>
</div>
</form>
</div>
</div>
<th:block th:include="include :: footer" />
<!--用于可以修改列表字段的插件-->
<th:block th:include="include :: bootstrap-table-editable-js" />
<script th:inline="javascript">
var prefix = ctx + "aftersales/complaintNotice";
var removeFlag = [[${@permission.hasPermi('aftersales:complaintNotice:remove')}]];
var aftersalesComplaintNotice = [[${aftersalesComplaintNotice}]];
var prefix = ctx + "aftersales/complaintNotice"
var customerId = [[${aftersalesComplaintNotice.customerId}]]
var makeNo = [[${aftersalesComplaintNotice.makeNo}]]
$("#form-complaintNotice-edit").validate({
focusCleanup: true
});
// 新增提交
function submitHandler() {
if ($.validate.form()) {
$.operate.save(prefix + "/edit", $('#form-complaintNotice-edit').serialize());
// 获取表单数据
// const complaintNoticeData = $("#form-complaintNotice-edit").serializeArray();
// 获取表单数据
const complaintNoticeData = $("#form-complaintNotice-edit").serializeArray().reduce((obj, item) => {
obj[item.name] = item.value;
return obj;
}, {});
// 获取bootstrap-table的数据,这里假设你使用bootstrap-table的API获取所有数据
var table = $('#bootstrap-table').bootstrapTable('getData');
// 将表数据转换成与complaintNoticeData格式一致的数组
var materialDataList = table.map(function(item) {
// 根据实际字段名调整
return {
"materialNo": item.materialNo, // 假设id对应materialId
"materialPhotourl": item.materialPhotourl, // 假设quantity是物料数量字段
"materialName": item.materialName,
"materialType": item.materialType,
"materialUnit": item.materialUnit,
"materialBrand": item.materialBrand,
"materialDescribe": item.materialDescribe,
"snCode": item.snCode,
"complaintProblem": item.complaintProblem,
// "emergencyDegree": item.emergencyDegree,
"adverseReportUrl": item.adverseReportUrl,
// ...其他字段
};
});
// 合并表单数据和表格数据
//const combinedData = Object.assign({}, ...complaintNoticeData.map(item => ({ [item.name]: item.value })), ...materialData);
const combinedData = Object.assign({}, complaintNoticeData, { aftersalesMaterialVOs: materialDataList });
console.log(combinedData)
// 使用 JSON.stringify() 序列化数据
const jsonData = JSON.stringify(combinedData);
// 发送 AJAX 请求到后端接口
$.operate.saveJson(prefix + "/edit", jsonData);
}
//获取客户信息
$(document).ready(function() {
// 初始化时默认加载客户编号列表
loadCustomerIds();
// 监听客户编号下拉框的变化
$('#customerId').on('change', function() {
var selectedCustomerId = $(this).val(); // 获取选中的客户ID
if (selectedCustomerId) {
// 发起Ajax请求获取客户名称
$.ajax({
type: 'GET',
url: ctx +'system/customer/getCustomerNameByEnterpriseCode/' + selectedCustomerId, // 替换为你的实际API路径
dataType: 'json', // 假设返回的数据格式是JSON
success: function(data) {
console.log(data);
// 将获取到的客户名称填充到输入框
if(data.data == null){
// 如果返回的数据有问题,可以给出提示或处理
alert('未能获取到客户名称!');
}
$('input[name="customerName"]').val(data.data.customerName);
},
error: function(jqXHR, textStatus, errorThrown) {
console.error('Error:', textStatus, errorThrown);
alert('查询客户名称时发生错误!');
}
});
} else {
// 如果没有选择客户ID,清空客户名称输入框
$('input[name="customerName"]').val('');
}
});
});
//获取已经选择客户Id相关的生产单号
function loadMakeNos() {
var selectedCustomerId = $('#customerId').val(); // 获取选中的客户ID
if (!selectedCustomerId) {
// 如果没有选中客户,则清空生产单号下拉框并可添加提示信息
$('#makeNo').empty().append('<option value="">请选择客户编号后加载生产单号</option>');
return; // 直接返回,不发起请求
}
var makeNoUrl = ctx + 'aftersales/complaintNotice/getMakeNosByCustomerId/' + selectedCustomerId; // 假定的后端接口URL,根据实际调整
$.ajax({
type: 'GET',
url: makeNoUrl,
dataType: 'json',
success: function(data) {
console.log(data);
if (data && Array.isArray(data)) {
var selectElement = $('#makeNo'); // 获取生产单号下拉框元素
selectElement.empty(); // 清空现有选项
// 添加默认选项(如果需要)
// selectElement.append('<option value="">请选择生产单号</option>');
// 遍历返回的数据,添加为下拉框的选项
$.each(data, function(index, item) {
// 假设item有makeNo属性,代表生产单号
selectElement.append('<option value="' + item.makeNo + '">' + item.makeNo + '</option>');
});
$("#makeNo").val(makeNo);
} else {
console.error('数据为空.');
// 可能还需要处理UI显示,比如提示无相关生产单号
}
},
error: function(jqXHR, textStatus, errorThrown) {
console.error('Failed to fetch make numbers: ' + textStatus + ', ' + errorThrown);
// 同样考虑UI反馈,如提示加载失败
}
});
}
// 假设的加载客户编号列表函数
function loadCustomerIds() {
var url = ctx + 'system/customer/getCustomers';
$.ajax({
type: 'GET', // 请求类型
url: url, // 后端接口URL
dataType: 'json', // 预期服务器返回的数据类型
success: function(data) {
if (data && Array.isArray(data)) {
var selectElement = $('#customerId'); // 获取客户编号下拉框元素
// 清空下拉框现有选项
selectElement.empty();
// // 添加默认选项(如果需要)编辑时不需要添加默认选项
// selectElement.append('<option value="">请选择客户编号</option>');
// 遍历返回的数据,添加为下拉框的选项
$.each(data, function(index, item) {
// 假设item有id和name两个属性,分别代表客户ID和客户编号
selectElement.append('<option value="' + item.customerId + '">' + item.customerId + '</option>');
});
$('#customerId').val(customerId);
loadMakeNos();
} else {
console.error('Data is not an array or is empty.');
}
},
error: function(jqXHR, textStatus, errorThrown) {
console.error('Failed to fetch customer IDs: ' + textStatus + ', ' + errorThrown);
}
});
}
// 点击选择物料按钮
function insertRow() {
var selectedMakeNo = $("#makeNo").val();
if (!selectedMakeNo) {
alert("请先选择生产单号。");
return;
}
var encodedMakeNo = encodeURIComponent(selectedMakeNo);
var url = ctx + 'aftersales/complaintNotice/materialSelect?makeNo=' + encodedMakeNo;
var options = {
title: '选择物料',
url: url,
callBack: doSubmit
};
$.modal.openOptions(options);
}
//物料信息展示列表
$(function() {
var options = {
url: ctx + "aftersales/complaintNotice/getMaterialListByNoticeCode",
queryParams: queryParams,
modalName: "选择物料",
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: 'SN号',
field: 'snCode',
editable: {
type: 'text', // 表示该列可以被编辑为文本
},
},
{
title: '客诉问题',
field: 'complaintProblem',
editable: {
type: 'text', // 表示该列可以被编辑为文本
},
},
{
title: '售后问题',
field: 'adverseReportUrl',
editable: {
type: 'text', // 表示该列可以被编辑为文本
// 可以在这里定义更多编辑行为,比如验证、提交等
},
},
{
title: '操作',
align: 'center',
formatter: function(value, row, index) {
var actions = [];
actions.push('<a class="btn btn-danger btn-xs" href="javascript:void(0)" onclick="removeRow(\'' + row.materialNo + '\')"><i class="fa fa-remove"></i>删除</a> ');
return actions.join('');
}
}
]
};
$.table.init(options);
})
function queryParams(params) {
var curParams = {
// 传递参数查询参数
complaintNoticeCode: aftersalesComplaintNotice.complaintNoticeCode
};
console.log(curParams);
return curParams;
}
function doSubmit(index, layero,uniqueId){
console.log(uniqueId);
var iframeWin = window[layero.find('iframe')[0]['name']];
var rowData = iframeWin.$('#bootstrap-materialSelect-table').bootstrapTable('getSelections')[0];
console.log("rowData: "+rowData);
$("#bootstrap-table").bootstrapTable('insertRow', {
index:1,
row: {
materialNo:rowData.materialNo,
materialPhotourl:rowData.materialPhotourl,
materialName: rowData.materialName,
materialType: rowData.materialType,
materialDescribe: rowData.materialDescribe,
materialBrand: rowData.materialBrand,
materialUnit: rowData.materialUnit,
materialProcessMethod: rowData.materialProcessMethod,
shippedGoodsSum: rowData.shippedGoodsSum,
snCode:"",
complaintProblem:"",
adverseReportUrl:"",
}
})
layer.close(index);
}
// 逻辑删除前端的一行数据
function removeRow(materialNo){
$("#bootstrap-table").bootstrapTable('remove', {
field: 'materialNo',
values: materialNo
})
}
</script>
</body>
</html>
Loading…
Cancel
Save