Commit 6884559a authored by wanghang's avatar wanghang

Merge remote-tracking branch 'origin/dev' into dev

parents 02c37dbc 3768dcf9
......@@ -294,7 +294,6 @@ function startup(operate, fn, showTips) {
// 保存
function save(fn, showTips) {
debugger
var extendedData = getExtendedData(ProcessAction.SAVE);
if (extendedData === false) {
return false;
......@@ -361,7 +360,7 @@ function doQueryAdvance() {
});
}
function doQueryHandlers() {debugger
function doQueryHandlers() {
var extendedData = getExtendedData(ProcessAction.QUERY_HANDLERS);
if (extendedData === false) {
return;
......
......@@ -10,7 +10,7 @@
<x:script src='/javaScript/remind.js'/>
<x:script src='/javaScript/addFunction.js'/>
<x:script src='/javaScript/HomePage.js'/>
<link href='<c:url value="/themes/css/homePage.css"/>' rel="stylesheet" type="text/css" />
<%--<link href='<c:url value="/themes/css/homePage.css"/>' rel="stylesheet" type="text/css" />--%>
<%--<x:script src='/javaScript/HomePageEcharts.js'/>--%>
</head>
<body>
......
......@@ -3,7 +3,7 @@ var bomGridManager = null, technologyGridManager = null;
$(document).ready(function () {
initializateUI();
initializateBomGrid();
initializateTechnologyGrid();
//initializateTechnologyGrid();
});
......@@ -17,6 +17,18 @@ function initializateBomGrid() {
addHandler: function(){
UICtrl.addGridRow(bomGridManager,{ sequence: bomGridManager.getData().length + 1 });
},
deleteHandler: function (){
var _grid = UICtrl.getGridManager('#bomGrid');
DataUtil.delSelectedRows({
action: 'quotationItem/deleteQuotationItem.ajax',
param: {},
gridManager: _grid,
idFieldName: 'quotationItemId',
onSuccess: function () {
reloadGrid();
}
});
},
});
bomGridManager = UICtrl.grid("#bomGrid", {
columns: [
......@@ -24,43 +36,69 @@ function initializateBomGrid() {
editor: { type: 'spinner', min: 1, max: 100, mask: 'nnn'}
},
{
display: "产品编码", name: "productCode", width: 140, minWidth: 60, type: "string", align: "left",
display: "名称", name: "productName", width: 140, minWidth: 60, type: "string", align: "left",
editor: {
data: {
type: 'system',
name: "productChoose",
back: {
productId: "productId",
productCode: "productCode",
//productCode: "productCode",
productName: "productName",
productUnit: "productUnit",
//productUnit: "productUnit",
}
},
required: true,
required: false,
type: "select"
}
},
{display: "产品名称", name: "productName", width: 120, minWidth: 60, type: "string", align: "left"},
{display: "单位", name: "productUnit", width: 120, minWidth: 60, type: "string", align: "left"},
/*{
display: "币别", name: "currency", width: 140, minWidth: 60, type: "string", align: "left",
{display: "产品代号", name: "productCodeName", width: 120, minWidth: 60, type: "string", align: "left",
editor: {
required: true,
required: false,
type: 'text'
}
},*/
},
{display: "图片", name: "picture", width: 120, minWidth: 60, type: "string", align: "left",
editor: {
required: false,
type: 'text'
}
},
{
display: "用量", name: "price", width: 120, minWidth: 60, type: "string", align: "left",
display: "产品参数", name: "productParameter", width: 300, minWidth: 60, type: "string", align: "left",
editor: {
required: true,
required: false,
type: 'text'
}
},
{
display: "含13%增值税&含运费单价(RMB/张)", name: "taxPrice", width: 250, minWidth: 60, type: "string", align: "left",
editor: {
required: false,
type: 'text',
mask: '9999999.99'
}
},
{
display: "备注", name: "remark", width: 140, minWidth: 60, type: "string", align: "left",
display: "出厂价单价(USD/张)", name: "price", width: 200, minWidth: 60, type: "string", align: "left",
editor: {
required: true,
required: false,
type: 'text',
mask: '9999999.99'
}
},
{
display: "MOQ(最小起订量)", name: "moq", width: 120, minWidth: 60, type: "string", align: "left",
editor: {
required: false,
type: 'text',
mask: '9999999.99'
}
},
{
display: "备注", name: "remark", width: 200, minWidth: 60, type: "string", align: "left",
editor: {
required: false,
type: 'text'
}
},
......@@ -73,7 +111,7 @@ function initializateBomGrid() {
toolbar: toolbarOptions,
enabledEdit: true,
width: "100%",
height: "400",
height: "90%",
heightDiff: -8,
checkbox: true,
fixedCellHeight: true,
......@@ -84,13 +122,13 @@ function initializateBomGrid() {
onAfterShowData: function (currentData) {
setTimeout(function () {
//加载工艺
reloadTechnologyGrid();
//reloadTechnologyGrid();
},200)
},
onAfterEdit:function (item) {
//加载工艺
if (item.column.name == "productCode") {
reloadTechnologyGrid();
//reloadTechnologyGrid();
}
}
});
......@@ -101,9 +139,19 @@ function initializateTechnologyGrid() {
var toolbarOptions = UICtrl.getDefaultToolbarOptions({});
technologyGridManager = UICtrl.grid("#technologyGrid", {
columns: [
{display: "工艺", name: "technologyName", width: 140, minWidth: 60, type: "string", align: "left"},
{display: "工序", name: "processName", width: 120, minWidth: 60, type: "string", align: "left"},
{display: "资源", name: "resourceName", width: 120, minWidth: 60, type: "string", align: "left"},
//{display: "工艺", name: "technologyName", width: 140, minWidth: 60, type: "string", align: "left"},
{display: "工序", name: "processName", width: 120, minWidth: 60, type: "string", align: "left",
editor: {
required: false,
type: 'text'
}
},
{display: "资源", name: "resourceName", width: 120, minWidth: 60, type: "string", align: "left",
editor: {
required: false,
type: 'text'
}
},
],
dataAction: "server",
url: web_app.name + '/technology/queryTechnologyByProduct.ajax',
......
......@@ -37,8 +37,8 @@
<x:title title="BOM信息" name="group" hideTable="#info" />
<div id="bomGrid" style="margin: 2px;"></div>
<x:title title="工艺信息" name="group" hideTable="#info" />
<div id="technologyGrid" style="margin: 2px;"></div>
<%--<x:title title="工艺信息" name="group" hideTable="#info" />
<div id="technologyGrid" style="margin: 2px;"></div>--%>
</form>
</div>
</body>
......
......@@ -8,7 +8,7 @@ $(document).ready(function () {
function loadProcessListGrid() {
var toolbarOptions = UICtrl.getDefaultToolbarOptions({
addHandler: function () {
UICtrl.addGridRow(processGridManager,{ sequence: processGridManager.getData().length + 1 });
UICtrl.addGridRow(processGridManager,{ sortNum: processGridManager.getData().length + 1 });
},
deleteHandler: function () {
var _grid = UICtrl.getGridManager('#processListGrid');
......
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<head>
<title> 品牌报价单</title>
<#include "/print/commonStyleTemplate.ftl" />
<style type="text/css">
td {
font-size: 13px;
}
</style>
</head>
<body>
<div style="text-align: center;font-size: large;font-weight:bold;"> ${companyNameEn?default("")?html}</div>
<div style="text-align: center">${address?default("")?html}</div>
<div style="text-align: center">tel:${tel?default("")?html} fax: ${fax?default("")?html}</div>
<div style="text-align: center">email: ${email?default("")?html}</div>
<div style="text-align: center">————————————————————————————</div>
<div class="billTitle"> 报价单</div>
<table cellspacing="0px" cellpadding="0px" class="tablePrint">
<div style="text-align: left">${fillinDate?default("")?html}</div>
<div style="text-align: left">Attn: ${Attn?default("")?html} </div>
<div style="text-align: left">From: ${From?default("")?html}</div>
<div style="text-align: left">Re: ${Re?default("")?html}</div>
<div style="text-align: left">${bsn?default("")?html}</div>
</table>
<table cellspacing="0px" cellpadding="0px" class="tableBorder">
<colgroup>
<col width='10%'/>
<col width='20%'/>
<col width='15%'/>
<col width='40%'/>
<col width='6%'/>
<col width='9%'/>
</colgroup>
<tr>
<td class="center">Item#(项目)</td>
<td class="center">Product Name(品名)</td>
<td class="center">Image(图片)</td>
<td class="center">Spec(规格)</td>
<td class="center">(Exw)出厂价 Unit Price (US$/pc)</td>
<td class="center">Remark(备注)</td>
</tr>
<#if gridData?? && gridData?size gt 0>
<#list gridData as detail>
<tr>
<td class="center">${detail.sequence?default("")?html}</td>
<td class="center">${detail.productName?default("")?html}</td>
<td class="center">${detail.picture?default("")?html}</td>
<td class="center">${detail.spec?default("")?html}</td>
<td class="center">${detail.price?default("")?html}</td>
<td class="center">${detail.remark?default("")?html}</td>
</tr>
</#list>
<#else>
<tr>
<td class="center">&nbsp;</td>
<td class="center">&nbsp;</td>
<td class="center">&nbsp;</td>
<td class="center">&nbsp;</td>
<td class="center">&nbsp;</td>
<td class="center">&nbsp;</td>
</tr>
</#if>
</table>
<div class="blank_div"></div>
<div style="text-align: left;font-size: large"> Terms</div>
<div style="text-align: left">${term1?default("")?html}</div>
<div style="text-align: left">${term2?default("")?html}</div>
<div style="text-align: left">${term3?default("")?html}</div>
<div style="text-align: left">${term4?default("")?html}</div>
<div style="text-align: left">${term5?default("")?html}</div>
<div class="blank_div"></div>
<div class="fontBold">审批明细</div>
<#include "/print/taskExecutionPrint.ftl" />
</body>
</html>
......@@ -14,7 +14,6 @@
</head>
<body>
<div class="billTitle"> ${companyName?default("")?html}</div>
<div style="text-align: center">${companyName?default("")?html}</div>
<div style="text-align: center">${address?default("")?html}</div>
<div style="text-align: center">tel:${tel?default("")?html} fax: ${fax?default("")?html}</div>
<div style="text-align: center">email: ${email?default("")?html}</div>
......
package com.huigou.topsun.customer.application;
import com.huigou.topsun.customer.domain.CustomerDebtContact;
import com.huigou.topsun.customer.domain.query.CustomerDebtContactQueryRequest;
import com.huigou.topsun.customer.domain.vo.CustomerDebtContactVo;
import java.util.List;
import java.util.Map;
public interface CustomerDebtContactApplication {
public static final String QUERY_XML_FILE_PATH = "config/topsun/customer/customerMapper.xml";
Map<String, Object> getCustomerDebtContactList(CustomerDebtContactQueryRequest queryRequest);
CustomerDebtContactVo saveCustomerDebtContact(CustomerDebtContact customerDebtContact);
void deleteCustomerDebtContact(List<String> ids);
}
package com.huigou.topsun.customer.application;
import com.huigou.topsun.customer.domain.CustomerPayInfo;
import com.huigou.topsun.customer.domain.query.CustomerPayInfoQueryRequest;
import com.huigou.topsun.customer.domain.vo.CustomerPayInfoVo;
import java.util.List;
import java.util.Map;
/**
* title:
* author:ZHT
* date:2023/12/19
* description:
*/
public interface CustomerPayInfoApplication {
public static final String QUERY_XML_FILE_PATH = "config/topsun/customer/customerMapper.xml";
Map<String, Object> getCustomerPayInfoList(CustomerPayInfoQueryRequest queryRequest);
CustomerPayInfoVo updateCustomerPayInfo(CustomerPayInfo customerPayInfo);
CustomerPayInfoVo saveCustomerPayInfo(CustomerPayInfo customerPayInfo);
void deleteCustomerPayInfo(List<String> ids);
CustomerPayInfoVo getCustomerPayInfoById(String customerPayInfoId);
}
package com.huigou.topsun.customer.application;
import com.huigou.topsun.customer.domain.CustomerRelated;
import com.huigou.topsun.customer.domain.query.CustomerRelatedQueryRequest;
import com.huigou.topsun.customer.domain.vo.CustomerRelatedVo;
import java.util.List;
import java.util.Map;
/**
* title:
* author:ZHT
* date:2023/12/19
* description:
*/
public interface CustomerRelatedApplication {
public static final String QUERY_XML_FILE_PATH = "config/topsun/customer/customerMapper.xml";
Map<String, Object> getCustomerRelatedList(CustomerRelatedQueryRequest queryRequest);
CustomerRelatedVo saveCustomerRelated(CustomerRelated customerRelated);
void deleteCustomerRelated(List<String> ids);
}
package com.huigou.topsun.customer.application.Impl;
import com.huigou.cache.DictUtil;
import com.huigou.data.query.model.QueryDescriptor;
import com.huigou.data.query.model.QueryModel;
import com.huigou.topsun.customer.application.CustomerDebtContactApplication;
import com.huigou.topsun.customer.domain.CustomerDebtContact;
import com.huigou.topsun.customer.domain.query.CustomerDebtContactQueryRequest;
import com.huigou.topsun.customer.domain.vo.CustomerDebtContactVo;
import com.huigou.topsun.customer.repository.CustomerDebtContactRepository;
import com.huigou.uasp.bmp.common.application.BaseApplication;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
public class CustomerDebtContactApplicationImpl implements CustomerDebtContactApplication {
import java.util.Date;
import java.util.List;
import java.util.Map;
@Service
public class CustomerDebtContactApplicationImpl extends BaseApplication implements CustomerDebtContactApplication {
// 导入催货款通知邮箱Dao层
@Autowired
private CustomerDebtContactRepository customerDebtContactRepository;
@Override
public Map<String, Object> getCustomerDebtContactList(CustomerDebtContactQueryRequest queryRequest) {
QueryDescriptor queryDescriptor = this.sqlExecutorDao.getQuery(QUERY_XML_FILE_PATH, "customerDebtContact");
QueryModel queryModel = this.sqlExecutorDao.getQueryModel(queryDescriptor, queryRequest);
queryModel.putDictionary("customerEmailType", DictUtil.getDictionary("customerEmailType"));
queryModel.putDictionary("sendEamil", DictUtil.getDictionary("sendEamil"));
Map<String, Object> map = this.sqlExecutorDao.executeSlicedQuery(queryModel);
return map;
}
@Override
public CustomerDebtContactVo saveCustomerDebtContact(CustomerDebtContact customerDebtContact) {
// 封装创建时间
long timestamp = System.currentTimeMillis();
customerDebtContact.setCreatedDate(new Date(timestamp));
customerDebtContact = customerDebtContactRepository.saveAndFlush(customerDebtContact);
CustomerDebtContactVo customerDebtContactVo = CustomerDebtContactVo.getCustomerDebtContactVo(customerDebtContact);
return customerDebtContactVo;
}
@Override
public void deleteCustomerDebtContact(List<String> ids) {
ids.forEach(id -> customerDebtContactRepository.delete(id));
}
}
package com.huigou.topsun.customer.application.Impl;
import com.huigou.data.query.model.QueryDescriptor;
import com.huigou.data.query.model.QueryModel;
import com.huigou.topsun.customer.application.CustomerPayInfoApplication;
import com.huigou.topsun.customer.domain.CustomerPayInfo;
import com.huigou.topsun.customer.domain.query.CustomerPayInfoQueryRequest;
import com.huigou.topsun.customer.domain.vo.CustomerPayInfoVo;
import com.huigou.topsun.customer.repository.CustomerPayInfoRepository;
import com.huigou.uasp.bmp.common.application.BaseApplication;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Date;
import java.util.List;
import java.util.Map;
/**
* title:
* author:ZHT
* date:2023/12/19
* description:
*/
@Service
public class CustomerPayInfoApplicationImpl extends BaseApplication implements CustomerPayInfoApplication {
@Autowired
private CustomerPayInfoRepository customerPayInfoRepository;
@Override
public Map<String, Object> getCustomerPayInfoList(CustomerPayInfoQueryRequest queryRequest) {
QueryDescriptor queryDescriptor = this.sqlExecutorDao.getQuery(QUERY_XML_FILE_PATH, "CustomerPayInfo");
QueryModel queryModel = this.sqlExecutorDao.getQueryModel(queryDescriptor, queryRequest);
Map<String, Object> map = this.sqlExecutorDao.executeSlicedQuery(queryModel);
return map;
}
@Override
public CustomerPayInfoVo updateCustomerPayInfo(CustomerPayInfo customerPayInfo) {
// 获取时间
long timeMillis = System.currentTimeMillis();
customerPayInfo.setLastModifiedDate(new Date(timeMillis));
customerPayInfo = customerPayInfoRepository.saveAndFlush(customerPayInfo);
return CustomerPayInfoVo.getCustomerPayInfoVo(customerPayInfo);
}
@Override
public CustomerPayInfoVo saveCustomerPayInfo(CustomerPayInfo customerPayInfo) {
// 获取时间
long timeMillis = System.currentTimeMillis();
customerPayInfo.setCreatedDate(new Date(timeMillis));
customerPayInfo = customerPayInfoRepository.saveAndFlush(customerPayInfo);
return CustomerPayInfoVo.getCustomerPayInfoVo(customerPayInfo);
}
@Override
public void deleteCustomerPayInfo(List<String> ids) {
ids.forEach(id -> customerPayInfoRepository.delete(id));
}
@Override
public CustomerPayInfoVo getCustomerPayInfoById(String customerPayInfoId) {
CustomerPayInfo one = customerPayInfoRepository.getOne(customerPayInfoId);
return CustomerPayInfoVo.getCustomerPayInfoVo(one);
}
}
package com.huigou.topsun.customer.application.Impl;
import com.huigou.data.query.model.QueryDescriptor;
import com.huigou.data.query.model.QueryModel;
import com.huigou.topsun.customer.application.CustomerRelatedApplication;
import com.huigou.topsun.customer.domain.CustomerRelated;
import com.huigou.topsun.customer.domain.query.CustomerRelatedQueryRequest;
import com.huigou.topsun.customer.domain.vo.CustomerRelatedVo;
import com.huigou.topsun.customer.repository.CustomerRelatedRepository;
import com.huigou.uasp.bmp.common.application.BaseApplication;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Date;
import java.util.List;
import java.util.Map;
/**
* title:
* author:ZHT
* date:2023/12/19
* description:
*/
@Service
public class CustomerRelatedApplicationImpl extends BaseApplication implements CustomerRelatedApplication {
@Autowired
private CustomerRelatedRepository customerRelatedRepository;
@Override
public Map<String, Object> getCustomerRelatedList(CustomerRelatedQueryRequest queryRequest) {
QueryDescriptor queryDescriptor = this.sqlExecutorDao.getQuery(QUERY_XML_FILE_PATH, "customerRelated");
QueryModel queryModel = this.sqlExecutorDao.getQueryModel(queryDescriptor, queryRequest);
Map<String, Object> map = this.sqlExecutorDao.executeSlicedQuery(queryModel);
return map;
}
@Override
public CustomerRelatedVo saveCustomerRelated(CustomerRelated customerRelated) {
// 封装时间
long timestamp = System.currentTimeMillis();
customerRelated.setCreatedDate(new Date(timestamp));
customerRelated = customerRelatedRepository.saveAndFlush(customerRelated);
return CustomerRelatedVo.getCustomerRelatedVo(customerRelated);
}
@Override
public void deleteCustomerRelated(List<String> ids) {
ids.forEach(id -> customerRelatedRepository.delete(id));
}
}
package com.huigou.topsun.customer.controller;
import com.huigou.topsun.customer.application.CustomerDebtContactApplication;
import com.huigou.topsun.customer.domain.CustomerDebtContact;
import com.huigou.topsun.customer.domain.query.CustomerDebtContactQueryRequest;
import com.huigou.topsun.customer.domain.vo.CustomerDebtContactVo;
import com.huigou.uasp.annotation.ControllerMapping;
import com.huigou.uasp.annotation.SkipAuth;
import com.huigou.uasp.client.CommonController;
import com.huigou.util.SDO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import java.util.List;
/**
* title:
* author:ZHT
* date:2023/12/19
* description:
* 催货款通知邮箱
*/
@Controller
@ControllerMapping("/customerDebtContact")
public class CustomerDebtContactController extends CommonController {
@Autowired
private CustomerDebtContactApplication customerDebtContactApplication;
@Override
protected String getPagePath() {
return "/biz/topsun/custcomer/";
}
/**
* 获取催货款通知邮箱
*/
@SkipAuth
public String slicedCustomerDebtContactList() {
SDO sdo = this.getSDO();
CustomerDebtContactQueryRequest queryRequest = sdo.toQueryRequest(CustomerDebtContactQueryRequest.class);
return toResult(customerDebtContactApplication.getCustomerDebtContactList(queryRequest));
}
/**
* 新增催货款通知邮箱
*/
@SkipAuth
public String saveCustomerDebtContact() {
SDO sdo = this.getSDO();
CustomerDebtContactVo customerDebtContactVo = sdo.toObject(CustomerDebtContactVo.class);
CustomerDebtContact customerDebtContact = CustomerDebtContactVo.getCustomerDebtContact(customerDebtContactVo);
// 获取操作人信息
String personMemberName = sdo.getOperator().getPersonMemberName();
String personMemberId = sdo.getOperator().getPersonMemberId();
customerDebtContact.setCreatedById(personMemberId);
customerDebtContact.setCreatedByName(personMemberName);
customerDebtContactVo = customerDebtContactApplication.saveCustomerDebtContact(customerDebtContact);
return success(customerDebtContactVo);
}
/**
* 删除催货款信息邮箱
*/
@SkipAuth
public String deleteCustomerDebtContact() {
SDO sdo = this.getSDO();
List<String> ids = sdo.getIds();
customerDebtContactApplication.deleteCustomerDebtContact(ids);
return success();
}
}
package com.huigou.topsun.customer.controller;
import com.huigou.topsun.customer.application.CustomerPayInfoApplication;
import com.huigou.topsun.customer.domain.CustomerPayInfo;
import com.huigou.topsun.customer.domain.query.CustomerPayInfoQueryRequest;
import com.huigou.topsun.customer.domain.vo.CustomerPayInfoVo;
import com.huigou.uasp.annotation.ControllerMapping;
import com.huigou.uasp.client.CommonController;
import com.huigou.util.SDO;
import com.huigou.util.StringUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import java.util.List;
/**
* title:
* author:ZHT
* date:2023/12/19
* description:
* 客户付款信息
*/
@Controller
@ControllerMapping("/customerPayInfo")
public class CustomerPayInfoController extends CommonController {
@Autowired
private CustomerPayInfoApplication customerPayInfoApplication;
@Override
protected String getPagePath() {
return "/biz/topsun/custcomer/";
}
/**
* 获取客户付款信息
*/
public String slicedCustomerPayInfoList() {
SDO sdo = this.getSDO();
CustomerPayInfoQueryRequest queryRequest = sdo.toQueryRequest(CustomerPayInfoQueryRequest.class);
return toResult(customerPayInfoApplication.getCustomerPayInfoList(queryRequest));
}
/**
* 添加、修改客户付款信息
*/
public String saveCustomerPayInfo() {
SDO sdo = this.getSDO();
CustomerPayInfoVo customerPayInfoVo = sdo.toObject(CustomerPayInfoVo.class);
CustomerPayInfo customerPayInfo = CustomerPayInfoVo.getCustomerPayInfo(customerPayInfoVo);
// 获取操作人信息
String personMemberName = sdo.getOperator().getPersonMemberName();
String personMemberId = sdo.getOperator().getPersonMemberId();
if (StringUtil.isNotBlank(customerPayInfo.getCustomerPayInfoId())) {
// 封装修改人信息
customerPayInfo.setLastModifiedByName(personMemberName);
customerPayInfo.setLastModifiedById(personMemberId);
customerPayInfoVo = customerPayInfoApplication.updateCustomerPayInfo(customerPayInfo);
} else {
// 封装创建人信息
customerPayInfo.setCreatedById(personMemberId);
customerPayInfo.setCreatedByName(personMemberName);
customerPayInfoVo = customerPayInfoApplication.saveCustomerPayInfo(customerPayInfo);
}
return success(customerPayInfoVo);
}
/**
* 删除客户付款信息
*/
public String deleteCustomerPayInfo() {
List<String> ids = this.getSDO().getIds();
customerPayInfoApplication.deleteCustomerPayInfo(ids);
return success();
}
/**
* 根据id获取客户付款信息
*/
public String findCustomerPayInfoById() {
SDO sdo = this.getSDO();
String customerPayInfoId = sdo.getString("customerPayInfoId");
CustomerPayInfoVo customerPayInfoVo = customerPayInfoApplication.getCustomerPayInfoById(customerPayInfoId);
return success(customerPayInfoVo);
}
}
package com.huigou.topsun.customer.controller;
import com.huigou.topsun.customer.application.CustomerRelatedApplication;
import com.huigou.topsun.customer.domain.CustomerRelated;
import com.huigou.topsun.customer.domain.query.CustomerRelatedQueryRequest;
import com.huigou.topsun.customer.domain.vo.CustomerRelatedVo;
import com.huigou.uasp.annotation.ControllerMapping;
import com.huigou.uasp.client.CommonController;
import com.huigou.util.SDO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import java.util.List;
/**
* title:
* author:ZHT
* date:2023/12/19
* description:
* 客户关联信息
*/
@Controller
@ControllerMapping("/customerRelated")
public class CustomerRelatedController extends CommonController {
@Autowired
private CustomerRelatedApplication customerRelatedApplication;
@Override
protected String getPagePath() {
return "/biz/topsun/custcomer/";
}
/**
* 获取客户关联信息
*/
public String slicedCustomerRelatedList() {
SDO sdo = this.getSDO();
CustomerRelatedQueryRequest queryRequest = sdo.toQueryRequest(CustomerRelatedQueryRequest.class);
return toResult(customerRelatedApplication.getCustomerRelatedList(queryRequest));
}
/**
* 新增客户关联信息
*/
public String saveCustomerRelated() {
SDO sdo = this.getSDO();
CustomerRelatedVo customerRelatedVo = sdo.toObject(CustomerRelatedVo.class);
CustomerRelated customerRelated = CustomerRelatedVo.getCustomerRelated(customerRelatedVo);
// 封装录入人信息
String personMemberName = sdo.getOperator().getPersonMemberName();
customerRelated.setCreatedByName(personMemberName);
customerRelatedVo = customerRelatedApplication.saveCustomerRelated(customerRelated);
return success(customerRelatedVo);
}
/**
* 删除客户关联信息
*/
public String deleteCustomerRelated() {
SDO sdo = this.getSDO();
List<String> ids = sdo.getIds();
customerRelatedApplication.deleteCustomerRelated(ids);
return success();
}
}
package com.huigou.topsun.customer.domain;
import java.io.Serializable;
import java.util.Date;
import javax.persistence.*;
import lombok.Data;
/**
* 催货款通知邮箱
* @TableName customer_debt_contact
*/
@Table(name="customer_debt_contact")
@Entity
@Data
public class CustomerDebtContact implements Serializable {
/**
* 催货款通知邮箱id
*/
@Id
@Column(name = "customer_debt_contact_id")
private String customerDebtContactId;
/**
* 客户id
*/
@Column(name = "customer_id")
private String customerId;
/**
* 邮箱地址
*/
@Column(name = "customer_eamil")
private String customerEamil;
/**
* 联系人
*/
@Column(name = "customer_contact")
private String customerContact;
/**
* 是否开启邮件发送
*/
@Column(name = "send_eamil")
private String sendEamil;
/**
* 邮箱类型(customerEmailType)-(宝绅邮箱、客户邮箱)
*/
@Column(name = "customer_email_type")
private String customerEmailType;
/**
* 创建人id
*/
@Column(name = "created_by_id")
private String createdById;
/**
* 创建人名称
*/
@Column(name = "created_by_name")
private String createdByName;
/**
* 创建日期
*/
@Column(name = "created_date")
private Date createdDate;
private static final long serialVersionUID = 1L;
}
\ No newline at end of file
package com.huigou.topsun.customer.domain;
import java.io.Serializable;
import java.util.Date;
import javax.persistence.*;
import lombok.Data;
/**
* 客户付款信息
* @TableName customer_pay_info
*/
@Table(name="customer_pay_info")
@Data
@Entity
public class CustomerPayInfo implements Serializable {
/**
* 客户付款信息表id
*/
@Id
@Column(name = "customer_pay_info_id")
private String customerPayInfoId;
/**
* 客户id
*/
@Column(name = "customer_id")
private String customerId;
/**
* 支付方户名
*/
@Column(name = "customer_pay_account_name")
private String customerPayAccountName;
/**
* 录入人
*/
@Column(name = "created_by_name")
private String createdByName;
/**
* 录入人id
*/
@Column(name = "created_by_id")
private String createdById;
/**
* 录入时间
*/
@Column(name = "created_date")
private Date createdDate;
/**
* 修改人id
*/
@Column(name = "last_modified_by_id")
private String lastModifiedById;
/**
* 修改人
*/
@Column(name = "last_modified_by_name")
private String lastModifiedByName;
/**
* 修改日期
*/
@Column(name = "last_modified_date")
private Date lastModifiedDate;
private static final long serialVersionUID = 1L;
}
\ No newline at end of file
package com.huigou.topsun.customer.domain;
import java.io.Serializable;
import java.util.Date;
import javax.persistence.*;
import lombok.Data;
/**
* 关联客户
* @TableName customer_related
*/
@Table(name="customer_related")
@Data
@Entity
public class CustomerRelated implements Serializable {
/**
* 关联客户id
*/
@Id
@Column(name = "customer_related_id")
private String customerRelatedId;
/**
* 客户id
*/
@Column(name = "customer_id")
private String customerId;
/**
* 关联客户编码
*/
@Column(name = "customer_code_related")
private String customerCodeRelated;
/**
* 关联客户简称
*/
@Column(name = "customer_short_name_related")
private String customerShortNameRelated;
/**
* 关联客户全称
*/
@Column(name = "customer_name_related")
private String customerNameRelated;
/**
* 录入人
*/
@Column(name = "created_by_name")
private String createdByName;
/**
* 录入时间
*/
@Column(name = "created_date")
private Date createdDate;
private static final long serialVersionUID = 1L;
}
\ No newline at end of file
package com.huigou.topsun.customer.domain.query;
import com.huigou.data.domain.query.QueryAbstractRequest;
import lombok.Data;
import java.util.Date;
/**
* title:
* author:ZHT
* date:2023/12/18
* description:
*/
@Data
public class CustomerDebtContactQueryRequest extends QueryAbstractRequest {
/**
* 催货款通知邮箱id
*/
private String customerDebtContactId;
/**
* 客户id
*/
private String customerId;
/**
* 邮箱地址
*/
private String customerEamil;
/**
* 联系人
*/
private String customerContact;
/**
* 是否开启邮件发送
*/
private String sendEamil;
/**
* 邮箱类型(customerEmailType)-(宝绅邮箱、客户邮箱)
*/
private String customerEmailType;
/**
* 创建人id
*/
private String createdById;
/**
* 创建人名称
*/
private String createdByName;
/**
* 创建日期
*/
private Date createdDate;
}
package com.huigou.topsun.customer.domain.query;
import com.huigou.data.domain.query.QueryAbstractRequest;
import lombok.Data;
import java.util.Date;
/**
* title:
* author:ZHT
* date:2023/12/18
* description:
*/
@Data
public class CustomerPayInfoQueryRequest extends QueryAbstractRequest {
/**
* 客户付款信息表id
*/
private String customerPayInfoId;
/**
* 客户id
*/
private String customerId;
/**
* 支付方户名
*/
private String customerPayAccountName;
/**
* 录入人
*/
private String createdByName;
/**
* 录入人id
*/
private String createdById;
/**
* 录入时间
*/
private Date createdDate;
/**
* 修改人id
*/
private String lastModifiedById;
/**
* 修改人
*/
private String lastModifiedByName;
/**
* 修改日期
*/
private Date lastModifiedDate;
}
\ No newline at end of file
package com.huigou.topsun.customer.domain.query;
import java.util.Date;
import javax.persistence.Column;
import javax.persistence.Id;
import com.huigou.data.domain.query.QueryAbstractRequest;
import lombok.Data;
/**
* title:
* author:ZHT
* date:2023/12/18
* description:
*/
@Data
public class CustomerRelatedQueryRequest extends QueryAbstractRequest {
/**
* 关联客户id
*/
private String customerRelatedId;
/**
* 客户id
*/
private String customerId;
/**
* 关联客户编码
*/
private String customerCodeRelated;
/**
* 关联客户简称
*/
private String customerShortNameRelated;
/**
* 关联客户全称
*/
private String customerNameRelated;
/**
* 录入人
*/
private String createdByName;
/**
* 录入时间
*/
private Date createdDate;
}
\ No newline at end of file
package com.huigou.topsun.customer.domain.vo;
import com.alibaba.fastjson.JSON;
import com.huigou.topsun.customer.domain.CustomerDebtContact;
import lombok.Data;
import javax.persistence.Column;
import javax.persistence.Id;
import java.io.Serializable;
import java.util.Date;
/**
* title:
* author:ZHT
* date:2023/12/19
* description:
*/
@Data
public class CustomerDebtContactVo implements Serializable {
/**
* 催货款通知邮箱id
*/
private String customerDebtContactId;
/**
* 客户id
*/
private String customerId;
/**
* 邮箱地址
*/
private String customerEamil;
/**
* 联系人
*/
private String customerContact;
/**
* 是否开启邮件发送
*/
private String sendEamil;
/**
* 邮箱类型(customerEmailType)-(宝绅邮箱、客户邮箱)
*/
private String customerEmailType;
/**
* 创建人id
*/
private String createdById;
/**
* 创建人名称
*/
private String createdByName;
/**
* 创建日期
*/
private Date createdDate;
public static CustomerDebtContact getCustomerDebtContact(CustomerDebtContactVo customerDebtContactVo){
return JSON.parseObject(JSON.toJSONString(customerDebtContactVo),CustomerDebtContact.class);
}
public static CustomerDebtContactVo getCustomerDebtContactVo(CustomerDebtContact customerDebtContact){
return JSON.parseObject(JSON.toJSONString(customerDebtContact), CustomerDebtContactVo.class);
}
}
package com.huigou.topsun.customer.domain.vo;
import com.alibaba.fastjson.JSON;
import com.huigou.topsun.customer.domain.CustomerPayInfo;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
/**
* title:
* author:ZHT
* date:2023/12/19
* description:
*/
@Data
public class CustomerPayInfoVo implements Serializable {
/**
* 客户付款信息表id
*/
private String customerPayInfoId;
/**
* 客户id
*/
private String customerId;
/**
* 支付方户名
*/
private String customerPayAccountName;
/**
* 录入人
*/
private String createdByName;
/**
* 录入人id
*/
private String createdById;
/**
* 录入时间
*/
private Date createdDate;
/**
* 修改人id
*/
private String lastModifiedById;
/**
* 修改人
*/
private String lastModifiedByName;
/**
* 修改日期
*/
private Date lastModifiedDate;
public static CustomerPayInfo getCustomerPayInfo(CustomerPayInfoVo customerPayInfoVo){
return JSON.parseObject(JSON.toJSONString(customerPayInfoVo),CustomerPayInfo.class);
}
public static CustomerPayInfoVo getCustomerPayInfoVo(CustomerPayInfo customerPayInfo){
return JSON.parseObject(JSON.toJSONString(customerPayInfo),CustomerPayInfoVo.class);
}
}
package com.huigou.topsun.customer.domain.vo;
import com.alibaba.fastjson.JSON;
import com.huigou.topsun.customer.domain.CustomerRelated;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
/**
* title:
* author:ZHT
* date:2023/12/19
* description:
*/
@Data
public class CustomerRelatedVo implements Serializable {
/**
* 关联客户id
*/
private String customerRelatedId;
/**
* 客户id
*/
private String customerId;
/**
* 关联客户编码
*/
private String customerCodeRelated;
/**
* 关联客户简称
*/
private String customerShortNameRelated;
/**
* 关联客户全称
*/
private String customerNameRelated;
/**
* 录入人
*/
private String createdByName;
/**
* 录入时间
*/
private Date createdDate;
public static CustomerRelated getCustomerRelated(CustomerRelatedVo customerRelatedVo){
return JSON.parseObject(JSON.toJSONString(customerRelatedVo),CustomerRelated.class);
}
public static CustomerRelatedVo getCustomerRelatedVo(CustomerRelated customerRelated){
return JSON.parseObject(JSON.toJSONString(customerRelated), CustomerRelatedVo.class);
}
}
package com.huigou.topsun.customer.repository;
import com.huigou.topsun.customer.domain.CustomerDebtContact;
import org.springframework.data.jpa.repository.JpaRepository;
/**
* title:
* author:ZHT
* date:2023/12/18
* description:
*/
public interface CustomerDebtContactRepository extends JpaRepository<CustomerDebtContact, String> {
}
package com.huigou.topsun.customer.repository;
import com.huigou.topsun.customer.domain.CustomerPayInfo;
import org.springframework.data.jpa.repository.JpaRepository;
/**
* title:
* author:ZHT
* date:2023/12/18
* description:
*/
public interface CustomerPayInfoRepository extends JpaRepository<CustomerPayInfo, String> {
}
package com.huigou.topsun.customer.repository;
import com.huigou.topsun.customer.domain.CustomerRelated;
import org.springframework.data.jpa.repository.JpaRepository;
/**
* title:
* author:ZHT
* date:2023/12/18
* description:
*/
public interface CustomerRelatedRepository extends JpaRepository<CustomerRelated,String> {
}
......@@ -15,12 +15,19 @@ import com.huigou.topsun.quotation.vo.QuotationItemVo;
import com.huigou.uasp.bmp.common.BizBillStatus;
import com.huigou.uasp.bpm.FlowBroker;
import com.huigou.util.ClassHelper;
import com.huigou.util.DateUtil;
import org.activiti.engine.delegate.DelegateExecution;
import org.activiti.engine.delegate.DelegateTask;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.time.Instant;
import java.time.LocalDate;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.Date;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.stream.Collectors;
......@@ -64,6 +71,30 @@ public class QuotationApplicationImpl extends FlowBroker implements QuotationApp
return ClassHelper.toMap(quotationRepository.getOne(bizId));
}
/**
* 设置任务名称
*/
@Override
protected void setTaskDescription(DelegateTask delegateTask) {
String bizId = delegateTask.getExecution().getProcessBusinessKey();
delegateTask.setDescription(this.getApprovalSubjectName(bizId));
}
/**
* 获取任务标题
*
* @param bizId
* @return
*/
private String getApprovalSubjectName(String bizId) {
Quotation quotation = this.findById(bizId);
String subjectName = String.format("%s-%s(%s)"
,quotation.getQuotationNo()
,quotation.getPersonMemberName()
,DateUtil.getDateFormat(ClassHelper.convert(quotation.getFillinDate(), Date.class)));
return subjectName;
}
@Override
protected void onEnd(DelegateExecution delegateExecution) {
super.onEnd(delegateExecution);
......@@ -128,10 +159,8 @@ public class QuotationApplicationImpl extends FlowBroker implements QuotationApp
QuotationItemVo quotationItemVo = new QuotationItemVo();
BeanUtil.copyProperties(quotationItem, quotationItemVo);
Product product = productRepository.findOne(quotationItem.getProductId());
quotationItemVo.setProductCode(product.getProductSampleCode());
quotationItemVo.setProductName(product.getProductName());
quotationItemVo.setProductUnit(product.getProductUnit());
//Product product = productRepository.findOne(quotationItem.getProductId());
//quotationItemVo.setProductUnit(product.getProductUnit());
return quotationItemVo;
})
.collect(Collectors.toList());
......@@ -171,12 +200,26 @@ public class QuotationApplicationImpl extends FlowBroker implements QuotationApp
String email = SystemCache.getParameter("bsn.brand.email", String.class);
String fax = SystemCache.getParameter("bsn.brand.fax", String.class);
String tel = SystemCache.getParameter("bsn.brand.tel", String.class);
String term1 = SystemCache.getParameter("bsn.brand.term1", String.class);
String term2 = SystemCache.getParameter("bsn.brand.term2", String.class);
String term3 = SystemCache.getParameter("bsn.brand.term3", String.class);
String term4 = SystemCache.getParameter("bsn.brand.term4", String.class);
String term5 = SystemCache.getParameter("bsn.brand.term5", String.class);
map.put("companyName",companyName);
map.put("companyNameEn",companyNameEn);
map.put("address",address);
map.put("email",email);
map.put("fax",fax);
map.put("tel",tel);
map.put("term1",term1);
map.put("term2",term2);
map.put("term3",term3);
map.put("term4",term4);
map.put("term5",term5);
map.put("Attn","Mitzi Cavour");
map.put("From","Paul Rao");
map.put("Re","BSN offer to Cariuma for Polybag&Label");
map.put("bsn","BSN (Baoshen) is glad to make the following quotation and look forward to working with Cariuma.");
return map;
}
}
......
......@@ -37,4 +37,11 @@ public class QuotationItemController extends CommonController {
}
return packGridDataAndResult(quotationItemVos);
}
public String deleteQuotationItem(){
SDO sdo = getSDO();
List<String> ids = sdo.getIds();
quotationItemApplication.deleteQuotationItem(ids);
return success();
}
}
......@@ -33,6 +33,7 @@ public class QuotationItem implements Serializable {
/**
* 序号/行项目
*/
@Column(name = "sequence")
private Integer sequence;
/**
......@@ -42,90 +43,61 @@ public class QuotationItem implements Serializable {
private String productId;
/**
* 单价
* 名称
*/
private BigDecimal price;
@Column(name = "product_name")
private String productName;
/**
* 币别(码表currency)
* 产品代号
*/
private String currency;
@Column(name = "product_code_name")
private String productCodeName;
/**
* 备注
* 图片
*/
private String remark;
@Column(name = "picture")
private String picture;
/**
* 产品参数
*/
@Column(name = "product_parameter")
private String productParameter;
/**
* 含13%增值税&含运费单价
*/
@Column(name = "tax_price")
private BigDecimal taxPrice;
/**
* 预估
* 出厂价单
*/
@Column(name = "presale_price")
private BigDecimal presalePrice;
@Column(name = "price")
private BigDecimal price;
/**
* 最小起订量
*/
@Column(name = "moq")
private BigDecimal moq;
/**
* 币别(码表currency)
*/
@Column(name = "currency")
private String currency;
/**
* 正式价格
* 备注
*/
@Column(name = "formal_price")
private BigDecimal formalPrice;
@Column(name = "remark")
private String remark;
private static final long serialVersionUID = 1L;
@Override
public boolean equals(Object that) {
if (this == that) {
return true;
}
if (that == null) {
return false;
}
if (getClass() != that.getClass()) {
return false;
}
QuotationItem other = (QuotationItem) that;
return (this.getQuotationItemId() == null ? other.getQuotationItemId() == null : this.getQuotationItemId().equals(other.getQuotationItemId()))
&& (this.getQuotationId() == null ? other.getQuotationId() == null : this.getQuotationId().equals(other.getQuotationId()))
&& (this.getSequence() == null ? other.getSequence() == null : this.getSequence().equals(other.getSequence()))
&& (this.getProductId() == null ? other.getProductId() == null : this.getProductId().equals(other.getProductId()))
&& (this.getPrice() == null ? other.getPrice() == null : this.getPrice().equals(other.getPrice()))
&& (this.getCurrency() == null ? other.getCurrency() == null : this.getCurrency().equals(other.getCurrency()))
&& (this.getRemark() == null ? other.getRemark() == null : this.getRemark().equals(other.getRemark()))
&& (this.getPresalePrice() == null ? other.getPresalePrice() == null : this.getPresalePrice().equals(other.getPresalePrice()))
&& (this.getFormalPrice() == null ? other.getFormalPrice() == null : this.getFormalPrice().equals(other.getFormalPrice()));
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((getQuotationItemId() == null) ? 0 : getQuotationItemId().hashCode());
result = prime * result + ((getQuotationId() == null) ? 0 : getQuotationId().hashCode());
result = prime * result + ((getSequence() == null) ? 0 : getSequence().hashCode());
result = prime * result + ((getProductId() == null) ? 0 : getProductId().hashCode());
result = prime * result + ((getPrice() == null) ? 0 : getPrice().hashCode());
result = prime * result + ((getCurrency() == null) ? 0 : getCurrency().hashCode());
result = prime * result + ((getRemark() == null) ? 0 : getRemark().hashCode());
result = prime * result + ((getPresalePrice() == null) ? 0 : getPresalePrice().hashCode());
result = prime * result + ((getFormalPrice() == null) ? 0 : getFormalPrice().hashCode());
return result;
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append(getClass().getSimpleName());
sb.append(" [");
sb.append("Hash = ").append(hashCode());
sb.append(", quotationItemId=").append(quotationItemId);
sb.append(", quotationId=").append(quotationId);
sb.append(", sequence=").append(sequence);
sb.append(", productId=").append(productId);
sb.append(", price=").append(price);
sb.append(", currency=").append(currency);
sb.append(", remark=").append(remark);
sb.append(", presalePrice=").append(presalePrice);
sb.append(", formalPrice=").append(formalPrice);
sb.append(", serialVersionUID=").append(serialVersionUID);
sb.append("]");
return sb.toString();
}
}
\ No newline at end of file
package com.huigou.topsun.quotation.vo;
import lombok.Data;
import org.hibernate.annotations.GenericGenerator;
import javax.persistence.*;
import java.io.Serializable;
import java.math.BigDecimal;
......@@ -13,9 +10,6 @@ import java.math.BigDecimal;
*/
@Data
public class QuotationItemVo implements Serializable {
/**
*
*/
private String quotationItemId;
/**
......@@ -34,34 +28,53 @@ public class QuotationItemVo implements Serializable {
private String productId;
/**
* 单价
* 名称
*/
private BigDecimal price;
private String productName;
/**
* 币别(码表currency)
* 产品代号
*/
private String currency;
private String productCodeName;
/**
* 备注
* 图片
*/
private String remark;
private String picture;
/**
* 预估价
* 产品参数
*/
@Column(name = "presale_price")
private BigDecimal presalePrice;
private String productParameter;
/**
* 正式价格
* 含13%增值税&含运费单价
*/
private BigDecimal formalPrice;
private BigDecimal taxPrice;
private String productCode;
/**
* 出厂价单价
*/
private BigDecimal price;
private String productName;
/**
* 最小起订量
*/
private BigDecimal moq;
/**
* 币别(码表currency)
*/
private String currency;
/**
* 备注
*/
private String remark;
/**
* 单位
*/
private String productUnit;
}
\ No newline at end of file
......@@ -7,4 +7,29 @@
</sql-query>
<condition column="customer_name" name="customerName" type="java.lang.String" symbol="like" alias="c"/>
</query>
<query name="customerDebtContact" label="催货款通知邮箱表" table="customer_debt_contact">
<sql-query>
select c.*
from customer_debt_contact c
where customer_email_type = ?
and customer_id = ?
</sql-query>
</query>
<query name="customerRelated" label="客户关系关联信息表" table="customer_related">
<sql-query>
select c.*
from customer_related c
where customer_id = ?
</sql-query>
</query>
<query name="CustomerPayInfo" label="客户付款信息表" table="customer_pay_info">
<sql-query>
select c.*
from customer_pay_info c
where customer_id = ?
</sql-query>
</query>
</query-mappings>
\ No newline at end of file
......@@ -4,15 +4,20 @@
<query name="queryQuotationItemList" label="报价明细表" table="quotation_item">
<sql-query>
SELECT
qi.*,
p.product_name,
p.product_unit,
pc.product_category_code AS product_code
FROM
quotation_item qi
LEFT JOIN product p ON qi.product_id = p.product_id
LEFT JOIN product_category pc ON p.product_category_id = pc.product_category_id
where qi.quotation_id = ?
qi.quotation_item_id,
qi.quotation_id,
qi.sequence,
qi.product_id,
qi.price,
qi.currency,
qi.remark,
qi.product_name,
qi.product_code_name,
qi.picture,
qi.product_parameter,
qi.tax_price,
qi.moq
FROM quotation_item qi where qi.quotation_id = ?
</sql-query>
</query>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment