품질관리_고객CS관리

This commit is contained in:
2025-12-09 11:53:57 +09:00
parent d3e2ffa662
commit a4a066390d
11 changed files with 1378 additions and 274 deletions

View File

@@ -388,6 +388,23 @@ public class CommonController {
return "/viewImage";
}
/**
* objId 기반 이미지 뷰어 (한글 파일명 지원)
* @param request
* @param paramMap
* @return
*/
@RequestMapping("/common/viewImageByObjId.do")
public String viewImageByObjId(HttpServletRequest request, @RequestParam Map<String, Object> paramMap){
Map fileInfo = commonService.getFileInfo(paramMap);
if(fileInfo != null){
request.setAttribute("attDir", CommonUtils.checkNull(fileInfo.get("FILE_PATH")));
request.setAttribute("savedFileName", CommonUtils.checkNull(fileInfo.get("SAVED_FILE_NAME")));
request.setAttribute("realFileName", CommonUtils.checkNull(fileInfo.get("REAL_FILE_NAME")));
}
return "/viewImageByObjId";
}
/**
* 사용자 조회(공통)
* @param request
@@ -621,6 +638,16 @@ public class CommonController {
return "/common/FileRegistPopup";
}
/**
* 이미지 파일 등록 팝업 (이미지만 업로드 가능)
*/
@RequestMapping("/common/ImageRegistPopup.do")
public String ImageRegistPopup(HttpServletRequest request, @RequestParam Map<String, Object> paramMap){
request.setAttribute("docType", CommonUtils.checkNull(paramMap.get("docType")));
request.setAttribute("docTypeName", CommonUtils.checkNull(paramMap.get("docTypeName")));
return "/common/ImageRegistPopup";
}
@RequestMapping("/common/FileDetailPopup.do")
public String FileDetailPopup(HttpServletRequest request, @RequestParam Map<String, Object> paramMap){
request.setAttribute("docType", CommonUtils.checkNull(paramMap.get("docType")));

View File

@@ -510,16 +510,25 @@ public class QualityController {
*/
@RequestMapping("/quality/customerCsList.do")
public String customerCsList(HttpServletRequest request, @RequestParam Map<String, Object> paramMap){
Map code_map = new HashMap();
try {
// 고객사
code_map.put("customer_cd", commonService.bizMakeOptionList("", "", "common.getClientMngSupplySelect"));
request.setAttribute("code_map", code_map);
} catch(Exception e) {
e.printStackTrace();
}
return "/quality/customerCsList";
}
/**
* 고객 CS 관리 그리드 목록 조회
*/
@ResponseBody
@RequestMapping("/quality/customerCsGridList.do")
public String customerCsGridList(HttpServletRequest request, @RequestParam Map<String, Object> paramMap){
request.setAttribute("RESULT", CommonUtils.getJsonArray(service.getCustomerCsList(request, paramMap)));
return "/ajax/ajaxResult";
public Map customerCsGridList(HttpServletRequest request, @RequestParam Map<String, Object> paramMap){
commonService.selectListPagingNew("quality.getCustomerCsList", request, paramMap);
return paramMap;
}
/**
@@ -527,9 +536,34 @@ public class QualityController {
*/
@RequestMapping("/quality/customerCsDefectFormPopUp.do")
public String customerCsDefectFormPopUp(HttpServletRequest request, @RequestParam Map<String, Object> paramMap){
Map code_map = new HashMap();
Map info = new HashMap();
try {
String objId = CommonUtils.checkNull(paramMap.get("OBJID"));
if(!objId.isEmpty()) {
info = service.getCustomerCsInfo(paramMap);
request.setAttribute("info", info);
}
// 고객사
code_map.put("customer_cd", commonService.bizMakeOptionList("", CommonUtils.nullToEmpty((String)info.get("customer_objid")), "common.getClientMngSupplySelect"));
} catch(Exception e) {
e.printStackTrace();
}
request.setAttribute("code_map", code_map);
return "/quality/customerCsDefectFormPopUp";
}
/**
* 고객 불량 저장
*/
@ResponseBody
@RequestMapping("/quality/saveCustomerCsDefect.do")
public Map saveCustomerCsDefect(HttpServletRequest request, @RequestParam Map<String, Object> paramMap){
return service.saveCustomerCsDefect(request, paramMap);
}
/**
* 조치결과 등록 팝업
*/
@@ -540,6 +574,15 @@ public class QualityController {
return "/quality/customerCsActionFormPopUp";
}
/**
* 조치결과 저장
*/
@ResponseBody
@RequestMapping("/quality/saveCustomerCsAction.do")
public Map saveCustomerCsAction(HttpServletRequest request, @RequestParam Map<String, Object> paramMap){
return service.saveCustomerCsAction(request, paramMap);
}
// =====================================================
// ECR 관리
// =====================================================

View File

@@ -1138,14 +1138,17 @@
<select id="getCustomerCsList" parameterType="map" resultType="map">
SELECT CCS.OBJID
, CCS.RECEIPT_NO
, TO_CHAR(CCS.RECEIPT_DATE, 'YYYY-MM-DD') AS RECEIPT_DATE
, CCS.RECEIPT_DATE
, CCS.QTY
, CCS.CUSTOMER_NAME
, CCS.CUSTOMER_OBJID
, (SELECT CLIENT_NM FROM CLIENT_MNG WHERE OBJID::VARCHAR = CCS.CUSTOMER_OBJID) AS CUSTOMER_NAME
, CCS.MODEL_NAME
, CCS.PRODUCT_NAME
, CCS.PART_NO
, TO_CHAR(CCS.PRODUCTION_DATE, 'YYYY-MM-DD') AS PRODUCTION_DATE
, TO_CHAR(CCS.SALES_DATE, 'YYYY-MM-DD') AS SALES_DATE
, CCS.PRODUCT_NO
, CCS.PART_NAME
, CCS.PRODUCTION_DATE
, CCS.SALES_DATE
, CCS.SERIAL_NO
, CCS.MANUFACTURER
, CCS.COMPLAINT_CONTENT
@@ -1153,30 +1156,37 @@
, CCS.BLAME_DECISION
, CCS.STATUS
, CCS.REMARK
, TO_CHAR(CCS.ACTION_DATE, 'YYYY-MM-DD') AS ACTION_DATE
, CCS.ACTION_DATE
, CCS.ACTION_USER_ID
, (SELECT USER_NAME FROM USER_INFO WHERE USER_ID = CCS.ACTION_USER_ID) AS ACTION_USER_NAME
, CASE WHEN CCS.ATTACH_FILE_OBJID IS NOT NULL THEN 'Y' ELSE 'N' END AS ATTACH_FILE
FROM PMS_QUALITY_CUSTOMER_CS CCS
, (SELECT COUNT(*) FROM ATTACH_FILE_INFO AFI WHERE AFI.TARGET_OBJID = CCS.OBJID AND AFI.DOC_TYPE = 'CUSTOMER_CS_IMAGE' AND STATUS = 'Active') AS IMAGE_FILE
, (SELECT COUNT(*) FROM ATTACH_FILE_INFO AFI WHERE AFI.TARGET_OBJID = CCS.OBJID AND AFI.DOC_TYPE = 'CUSTOMER_CS_ACTION' AND STATUS = 'Active') AS ATTACH_FILE
FROM CUSTOMER_CS CCS
WHERE 1=1
<if test="search_receipt_date_from != null and search_receipt_date_from != ''">
AND CCS.RECEIPT_DATE >= TO_DATE(#{search_receipt_date_from}, 'YYYY-MM-DD')
AND CCS.RECEIPT_DATE <![CDATA[>=]]> #{search_receipt_date_from}
</if>
<if test="search_receipt_date_to != null and search_receipt_date_to != ''">
AND CCS.RECEIPT_DATE <![CDATA[<=]]> TO_DATE(#{search_receipt_date_to}, 'YYYY-MM-DD')
AND CCS.RECEIPT_DATE <![CDATA[<=]]> #{search_receipt_date_to}
</if>
<if test="search_customer_name != null and search_customer_name != ''">
AND UPPER(CCS.CUSTOMER_NAME) LIKE UPPER('%' || #{search_customer_name} || '%')
<if test="search_customer_objid != null and search_customer_objid != ''">
AND CCS.CUSTOMER_OBJID = #{search_customer_objid}
</if>
<if test="search_model_name != null and search_model_name != ''">
AND UPPER(CCS.MODEL_NAME) LIKE UPPER('%' || #{search_model_name} || '%')
</if>
<if test="search_product_no != null and search_product_no != ''">
AND UPPER(CCS.PRODUCT_NO) LIKE UPPER('%' || #{search_product_no} || '%')
</if>
<if test="search_product_name != null and search_product_name != ''">
AND UPPER(CCS.PRODUCT_NAME) LIKE UPPER('%' || #{search_product_name} || '%')
</if>
<if test="search_part_no != null and search_part_no != ''">
AND UPPER(CCS.PART_NO) LIKE UPPER('%' || #{search_part_no} || '%')
</if>
<if test="search_part_name != null and search_part_name != ''">
AND UPPER(CCS.PART_NAME) LIKE UPPER('%' || #{search_part_name} || '%')
</if>
<if test="search_serial_no != null and search_serial_no != ''">
AND UPPER(CCS.SERIAL_NO) LIKE UPPER('%' || #{search_serial_no} || '%')
</if>
@@ -1190,10 +1200,10 @@
AND CCS.STATUS = #{search_status}
</if>
<if test="search_action_date_from != null and search_action_date_from != ''">
AND CCS.ACTION_DATE >= TO_DATE(#{search_action_date_from}, 'YYYY-MM-DD')
AND CCS.ACTION_DATE <![CDATA[>=]]> #{search_action_date_from}
</if>
<if test="search_action_date_to != null and search_action_date_to != ''">
AND CCS.ACTION_DATE <![CDATA[<=]]> TO_DATE(#{search_action_date_to}, 'YYYY-MM-DD')
AND CCS.ACTION_DATE <![CDATA[<=]]> #{search_action_date_to}
</if>
<if test="search_action_user != null and search_action_user != ''">
AND (
@@ -1208,14 +1218,17 @@
<select id="getCustomerCsInfo" parameterType="map" resultType="map">
SELECT CCS.OBJID
, CCS.RECEIPT_NO
, TO_CHAR(CCS.RECEIPT_DATE, 'YYYY-MM-DD') AS RECEIPT_DATE
, CCS.RECEIPT_DATE
, CCS.QTY
, CCS.CUSTOMER_NAME
, CCS.CUSTOMER_OBJID
, (SELECT CLIENT_NM FROM CLIENT_MNG WHERE OBJID::VARCHAR = CCS.CUSTOMER_OBJID) AS CUSTOMER_NAME
, CCS.MODEL_NAME
, CCS.PRODUCT_NAME
, CCS.PART_NO
, TO_CHAR(CCS.PRODUCTION_DATE, 'YYYY-MM-DD') AS PRODUCTION_DATE
, TO_CHAR(CCS.SALES_DATE, 'YYYY-MM-DD') AS SALES_DATE
, CCS.PRODUCT_NO
, CCS.PART_NAME
, CCS.PRODUCTION_DATE
, CCS.SALES_DATE
, CCS.SERIAL_NO
, CCS.MANUFACTURER
, CCS.COMPLAINT_CONTENT
@@ -1223,16 +1236,101 @@
, CCS.BLAME_DECISION
, CCS.STATUS
, CCS.REMARK
, TO_CHAR(CCS.ACTION_DATE, 'YYYY-MM-DD') AS ACTION_DATE
, CCS.ACTION_DATE
, CCS.ACTION_USER_ID
, (SELECT USER_NAME FROM USER_INFO WHERE USER_ID = CCS.ACTION_USER_ID) AS ACTION_USER_NAME
, CCS.ATTACH_FILE_OBJID
, CCS.WRITER
, TO_CHAR(CCS.REG_DATE, 'YYYY-MM-DD') AS REG_DATE
FROM PMS_QUALITY_CUSTOMER_CS CCS
FROM CUSTOMER_CS CCS
WHERE CCS.OBJID = #{OBJID}
</select>
<!-- 고객 CS 시퀀스 조회 -->
<select id="getCustomerCsSeq" resultType="int">
SELECT NEXTVAL('SEQ_CUSTOMER_CS_RECEIPT_NO')
</select>
<!-- 고객 CS 등록 -->
<insert id="insertCustomerCs" parameterType="map">
INSERT INTO CUSTOMER_CS (
OBJID
, RECEIPT_NO
, RECEIPT_DATE
, QTY
, CUSTOMER_OBJID
, MODEL_NAME
, PRODUCT_NO
, PRODUCT_NAME
, PART_NO
, PART_NAME
, PRODUCTION_DATE
, SALES_DATE
, SERIAL_NO
, MANUFACTURER
, COMPLAINT_CONTENT
, BLAME_DECISION
, STATUS
, REMARK
, WRITER
, REG_DATE
) VALUES (
#{OBJID}
, #{RECEIPT_NO}
, #{RECEIPT_DATE}
, NULLIF(#{QTY}, '')::NUMERIC
, #{CUSTOMER_OBJID}
, #{MODEL_NAME}
, #{PRODUCT_NO}
, #{PRODUCT_NAME}
, #{PART_NO}
, #{PART_NAME}
, #{PRODUCTION_DATE}
, #{SALES_DATE}
, #{SERIAL_NO}
, #{MANUFACTURER}
, #{COMPLAINT_CONTENT}
, #{BLAME_DECISION}
, #{STATUS}
, #{REMARK}
, #{WRITER}
, NOW()
)
</insert>
<!-- 고객 CS 수정 -->
<update id="updateCustomerCs" parameterType="map">
UPDATE CUSTOMER_CS SET
RECEIPT_DATE = #{RECEIPT_DATE}
, QTY = NULLIF(#{QTY}, '')::NUMERIC
, CUSTOMER_OBJID = #{CUSTOMER_OBJID}
, MODEL_NAME = #{MODEL_NAME}
, PRODUCT_NO = #{PRODUCT_NO}
, PRODUCT_NAME = #{PRODUCT_NAME}
, PART_NO = #{PART_NO}
, PART_NAME = #{PART_NAME}
, PRODUCTION_DATE = #{PRODUCTION_DATE}
, SALES_DATE = #{SALES_DATE}
, SERIAL_NO = #{SERIAL_NO}
, MANUFACTURER = #{MANUFACTURER}
, COMPLAINT_CONTENT = #{COMPLAINT_CONTENT}
, MOD_DATE = NOW()
WHERE OBJID = #{OBJID}
</update>
<!-- 고객 CS 조치결과 수정 -->
<update id="updateCustomerCsAction" parameterType="map">
UPDATE CUSTOMER_CS SET
ACTION_CONTENT = #{ACTION_CONTENT}
, BLAME_DECISION = #{BLAME_DECISION}
, ACTION_DATE = #{ACTION_DATE}
, ACTION_USER_ID = #{ACTION_USER_ID}
, STATUS = #{STATUS}
, REMARK = #{REMARK}
, MOD_DATE = NOW()
WHERE OBJID = #{OBJID}
</update>
<!-- =====================================================
ECR 관리
===================================================== -->

View File

@@ -956,6 +956,86 @@ public class QualityService extends BaseService{
return resultMap;
}
/**
* 고객 불량 저장
*/
public Map saveCustomerCsDefect(HttpServletRequest request, Map paramMap){
Map resultMap = new HashMap();
SqlSession sqlSession = null;
try{
sqlSession = SqlMapConfig.getInstance().getSqlSession();
PersonBean person = (PersonBean) request.getSession().getAttribute(Constants.PERSON_BEAN);
String writer = person != null ? person.getUserId() : "";
String objId = CommonUtils.checkNull(paramMap.get("OBJID"));
String isNew = CommonUtils.checkNull(paramMap.get("IS_NEW"));
paramMap.put("WRITER", writer);
// IS_NEW 플래그로 신규/수정 구분 (JSP에서 전달)
if("true".equals(isNew)){
// 신규 등록
if(objId.isEmpty()){
objId = CommonUtils.checkNull(CommonUtils.createObjId());
paramMap.put("OBJID", objId);
}
// 접수번호 생성 (CS-YYYYMMDD-SEQ)
String today = new java.text.SimpleDateFormat("yyyyMMdd").format(new java.util.Date());
String receiptNo = "CS-" + today + "-" + String.format("%03d", sqlSession.selectOne("quality.getCustomerCsSeq"));
paramMap.put("RECEIPT_NO", receiptNo);
sqlSession.insert("quality.insertCustomerCs", paramMap);
} else {
// 수정
sqlSession.update("quality.updateCustomerCs", paramMap);
}
resultMap.put("RESULT", "SUCCESS");
resultMap.put("OBJID", objId);
}catch(Exception e){
e.printStackTrace();
resultMap.put("RESULT", "FAIL");
resultMap.put("MESSAGE", e.getMessage());
}finally{
if(sqlSession != null) sqlSession.close();
}
return resultMap;
}
/**
* 조치결과 저장
*/
public Map saveCustomerCsAction(HttpServletRequest request, Map paramMap){
Map resultMap = new HashMap();
SqlSession sqlSession = null;
try{
sqlSession = SqlMapConfig.getInstance().getSqlSession();
PersonBean person = (PersonBean) request.getSession().getAttribute(Constants.PERSON_BEAN);
String actionUserId = person != null ? person.getUserId() : "";
paramMap.put("ACTION_USER_ID", actionUserId);
sqlSession.update("quality.updateCustomerCsAction", paramMap);
resultMap.put("RESULT", "SUCCESS");
}catch(Exception e){
e.printStackTrace();
resultMap.put("RESULT", "FAIL");
resultMap.put("MESSAGE", e.getMessage());
}finally{
if(sqlSession != null) sqlSession.close();
}
return resultMap;
}
// =====================================================
// ECR 관리
// =====================================================