20260512173244

This commit is contained in:
oneao committed 2026-05-12 17:32:45 +08:00
1 parent e98740192d
commit c81f78880e
6 files changed
+2369 -725

No files matched your search

+1 -1
View File
@@ -42,7 +42,7 @@
<dependency>
<groupId>com.microsoft.sqlserver</groupId>
<artifactId>mssql-jdbc</artifactId>
<version>13.4.0.jre8</version>
<version>6.2.2.jre8</version>
</dependency>
<dependency>
@@ -81,6 +81,7 @@ public class DataSourceManager extends AbstractRoutingDataSource {
}
private static DataSource createDataSource(String orgCode) throws Exception {
String file = CONFIG_PATH + orgCode + ".properties";
try (InputStream in = DataSourceManager.class
@@ -93,6 +94,7 @@ public class DataSourceManager extends AbstractRoutingDataSource {
Properties p = new Properties();
p.load(in);
requireProperty(p, "url", file);
requireProperty(p, "username", file);
requireProperty(p, "password", file);
@@ -101,44 +103,41 @@ public class DataSourceManager extends AbstractRoutingDataSource {
DruidDataSource ds = new DruidDataSource();
ds.setName(orgCode);
ds.setUrl(p.getProperty("url"));
ds.setUsername(p.getProperty("username"));
ds.setPassword(p.getProperty("password"));
ds.setDriverClassName(p.getProperty("driver"));
ds.setInitialSize(1);
ds.setMinIdle(1);
ds.setMaxActive(10);
ds.setMaxWait(3000);
// 连接池大小
ds.setInitialSize(2);
ds.setMinIdle(2);
ds.setMaxActive(50);
ds.setBreakAfterAcquireFailure(true);
ds.setConnectionErrorRetryAttempts(0);
ds.setFailFast(true);
// 获取连接超时时间
ds.setMaxWait(60000);
ds.setValidationQuery(VALIDATION_QUERY);
ds.setTestOnBorrow(false);
ds.setTestOnReturn(false);
// 连接检测
ds.setValidationQuery("SELECT 1");
ds.setTestOnBorrow(true);
ds.setTestWhileIdle(true);
// 空闲检测
ds.setTimeBetweenEvictionRunsMillis(60000);
ds.setMinEvictableIdleTimeMillis(300000);
ds.setKeepAlive(false);
// 保活
ds.setKeepAlive(true);
ds.setPoolPreparedStatements(false);
// 防止连接失败卡死
ds.setBreakAfterAcquireFailure(true);
ds.setConnectionErrorRetryAttempts(1);
ds.setFilters("stat,slf4j");
ds.setUseGlobalDataSourceStat(true);
ds.setConnectionProperties(
"druid.stat.mergeSql=true;" +
"druid.stat.slowSqlMillis=3000;" +
"druid.stat.logSlowSql=true"
);
ds.setRemoveAbandoned(false);
// 关闭慢SQL日志
ds.setFilters("stat");
ds.init();
return ds;
}
}
@@ -1,9 +1,9 @@
#url=jdbc:sqlserver://118.89.70.199:1433;databaseName=G3BoxOCR;encrypt=false
#url=jdbc:sqlserver://118.89.70.199:1433;databaseName=G3BoxOCR
#username=sa
#password=zhang520..
#driver=com.microsoft.sqlserver.jdbc.SQLServerDriver
url=jdbc:sqlserver://127.0.0.1:1433;databaseName=G3ContainerOCR;encrypt=false
url=jdbc:sqlserver://127.0.0.1:1433;databaseName=G3ContainerOCR
username=sa
password=123456@aaa
driver=com.microsoft.sqlserver.jdbc.SQLServerDriver
+215 -247
View File
@@ -180,7 +180,7 @@
<div style="height: calc(100% - 5px);">
<table id="feegrid" style="margin-bottom: 2px;"></table>
</div>
<div id='tb_con' style="margin-bottom: 2px;height: 24px;width: 100%; display: none;">
<div id='tb_con' style="margin-bottom: 2px;height: 24px;width: 100%;display: none">
<div style="float:left;">
<input type="button" tag='3' id='btn_xzfy' onclick="selectysfee()" value="选择费用"
class="g3-grid-Btn g3-btn-blue">
@@ -230,6 +230,8 @@
</div>
</div>
<div id="feegrid_pager" class="easyui-pagination"
style="margin: 6px 0px;background:#efefef;border:1px solid #ccc;"></div>
<div class="g3-form-row" style="height: 30px; width: 99%; display: flex; align-items: center; gap: 20px;">
@@ -281,7 +283,9 @@
let subSummary = {
moneyTypes: [],
totalAmount: 0
notMoneyTypes: [],
totalAmount: 0,
notAmount: 0
};
// DataGrid 管理器实例
@@ -473,22 +477,39 @@
// 创建 DataGridManager(自动初始化 datagrid 和分页器)
gridManager = createDataGridManager({
gridId: 'feegrid',
pagerId: 'feegrid_pager',
keyField: 'subid',
pageSize: 50,
viewName: subviewtable,
orderField: 'father ASC, mx_xh ASC, b_id ASC',
orderField: 'father ASC, mx_xh ASC',
baseSearchCondition: "mx_zdorderid='" + strid + "'",
selectAllBtn: '#btn_select_all',
selectAllText: '全部选中',
unselectAllText: '全部反选',
userid: '',
onLoadSuccess: function (rows) {
calcw_selfee();
// 添加 toolbar 配置
customDatagridOptions: {
toolbar: '#tb_con',
idField: 'subid',
fit: true,
remoteSort: false,
multiSort: true,
//multiSort :true,
singleSelect: true,
//ctrlSelect:true,
selectOnCheck: false,
checkOnSelect: false,
rownumbers: true,
autoRowHeight: false,
},
onLoadSuccess: function (rows, isFirstLoad) {
// if (isFirstLoad) {
// calcw_selfee();
// }
},
onAfterEdit: function (rowIndex, row, changes) {
calcw_fee();
},
onSelectionChange: function () {
console.log("===change===")
calcw_selfee();
}
});
@@ -517,148 +538,130 @@
//////////-------feegrid-----------
// 单行对「按币别汇总」的贡献,与 calcw_fee SQL 中 CASE 应收/应付 一致
function applyFeeRowToMoneyTypeGroups(groupMap, row, sign) {
function buildGroupMap(data, prefix) {
var groupMap = {};
var prefixLen = prefix.length;
for (var key in data) {
if (key.startsWith(prefix)) {
var currency = key.substring(prefixLen).toUpperCase();
var amount = Number(data[key] || 0);
if (!groupMap[currency]) {
groupMap[currency] = { mx_moneytype_id: currency, mx_amount: 0 };
}
groupMap[currency].mx_amount += amount;
}
}
return groupMap;
}
function applyFeeRowToGroup(groupMap, row, sign) {
var mt = row.mx_moneytype_id;
if (mt === undefined || mt === null || mt === '') {
return;
}
var rootNet = 0;
if (row.mx_type_id == '应收') {
rootNet = Number(row.mx_amount_root || 0);
} else if (row.mx_type_id == '应付') {
rootNet = -Number(row.mx_amount_root || 0);
}
if (!mt) return;
var amt = Number(row.mx_amount || 0);
if (row.mx_type_id == '应付') {
amt = -amt;
}
if (!groupMap[mt]) {
groupMap[mt] = { mx_moneytype_id: mt, mx_amount_root: 0, mx_amount: 0 };
groupMap[mt] = { mx_moneytype_id: mt, mx_amount: 0 };
}
groupMap[mt].mx_amount_root += sign * rootNet;
groupMap[mt].mx_amount += sign * amt;
}
function groupMapToArray(groupMap) {
var arr = [];
for (var mk in groupMap) {
var g = groupMap[mk];
g.mx_amount = Math.round(g.mx_amount * 100) / 100;
arr.push(g);
}
return arr.sort(function (a, b) {
return String(a.mx_moneytype_id).localeCompare(String(b.mx_moneytype_id));
});
}
function calcTotal(arr) {
var total = 0;
for (var i = 0; i < arr.length; i++) {
total += Number(arr[i].mx_amount || 0);
}
return Math.round(total * 100) / 100;
}
function buildDisplayText(arr) {
var txtArr = [];
for (var i = 0; i < arr.length; i++) {
var row = arr[i];
if (row.mx_amount !== 0) {
txtArr.push(row.mx_moneytype_id + " " + row.mx_amount);
}
}
return txtArr.join(";");
}
function calcw_fee() {
if (!strid) {
$("#div_total").text('0.00');
$('#b_amount').val('0.00');
subSummary.moneyTypes = [];
subSummary.notMoneyTypes = [];
subSummary.totalAmount = 0;
subSummary.notAmount = 0;
return;
}
var data = mainData;
var amountGroupMap = buildGroupMap(mainData, 'v_amount_');
var notAmountGroupMap = buildGroupMap(mainData, 'v_notamount_');
// 提取币种金额(v_amount_ 开头的字段)放入 groupMap
var groupMap = {};
for (var key in data) {
if (key.startsWith('v_amount_')) {
var currency = key.replace('v_amount_', '').toUpperCase();
var amount = Number(data[key] || 0);
groupMap[currency] = {
mx_moneytype_id: currency,
mx_amount_root: amount,
mx_amount: amount
};
}
}
// 草稿:已保存行标记删除 → 仍计入 DB 汇总,需扣回;本地新增 insertRows → 尚未进 DB,需加上
var dIdx;
var deleteRows = gridManager.getDeleteRows();
var insertRows = gridManager.getInsertRows();
for (dIdx = 0; dIdx < deleteRows.length; dIdx++) {
applyFeeRowToMoneyTypeGroups(groupMap, deleteRows[dIdx], -1);
for (var i = 0; i < deleteRows.length; i++) {
applyFeeRowToGroup(amountGroupMap, deleteRows[i], -1);
applyFeeRowToGroup(notAmountGroupMap, deleteRows[i], -1);
}
for (dIdx = 0; dIdx < insertRows.length; dIdx++) {
var insRow = insertRows[dIdx];
if (insRow._rowState === 'delete') {
continue;
for (var i = 0; i < insertRows.length; i++) {
if (insertRows[i]._rowState !== 'delete') {
applyFeeRowToGroup(amountGroupMap, insertRows[i], 1);
applyFeeRowToGroup(notAmountGroupMap, insertRows[i], 1);
}
applyFeeRowToMoneyTypeGroups(groupMap, insRow, 1);
}
// 构建合并后的 moneyTypes
var mergedDatas = [];
var mk;
for (mk in groupMap) {
var g = groupMap[mk];
g.mx_amount_root = Math.round(g.mx_amount_root * 1000) / 1000;
g.mx_amount = Math.round(g.mx_amount * 100) / 100;
mergedDatas.push(g);
}
mergedDatas.sort(function (a, b) {
return String(a.mx_moneytype_id).localeCompare(String(b.mx_moneytype_id));
var moneyTypes = groupMapToArray(amountGroupMap);
var notMoneyTypes = groupMapToArray(notAmountGroupMap);
subSummary.moneyTypes = moneyTypes.filter(function (r) {
return r.mx_amount !== 0;
});
// 计算总金额
var totalamount = 0;
for (var mi = 0; mi < mergedDatas.length; mi++) {
totalamount += Number(mergedDatas[mi].mx_amount || 0);
}
totalamount = Math.round(totalamount * 100) / 100;
// 更新 subSummary
subSummary.moneyTypes = mergedDatas.filter(function (r) {
return r.mx_amount_root !== 0 || r.mx_amount !== 0;
subSummary.notMoneyTypes = notMoneyTypes.filter(function (r) {
return r.mx_amount !== 0;
});
subSummary.totalAmount = totalamount;
subSummary.totalAmount = calcTotal(moneyTypes);
subSummary.notAmount = calcTotal(notMoneyTypes);
// 构建显示文本
var txtArr = [];
for (var mi = 0; mi < mergedDatas.length; mi++) {
var row = mergedDatas[mi];
if (row.mx_amount_root === 0 && row.mx_amount === 0) {
continue;
}
txtArr.push(row.mx_moneytype_id + " " + row.mx_amount_root);
}
var totaltxt = txtArr.join(";");
if (totalamount !== 0) {
totaltxt += " 折合金额:" + totalamount;
var totaltxt = buildDisplayText(moneyTypes);
if (subSummary.totalAmount !== 0) {
totaltxt += " 折合金额:" + subSummary.totalAmount;
}
$("#div_total").text(totaltxt);
$("#b_amount").val(totalamount);
$("#b_amount").val(subSummary.totalAmount);
console.log(subSummary);
calcDeleteFee();
}
function calcDeleteFee() {
var deleteRows = gridManager.getDeleteRows();
var deleteGroupMap = {};
var deleteRows = gridManager.getDeleteRows();
for (var i = 0; i < deleteRows.length; i++) {
var row = deleteRows[i];
var mt = row.mx_moneytype_id;
if (mt === undefined || mt === null || mt === '') {
continue;
}
var rootNet = 0;
if (row.mx_type_id == '应收') {
rootNet = Number(row.mx_amount_root || 0);
} else if (row.mx_type_id == '应付') {
rootNet = -Number(row.mx_amount_root || 0);
}
var amt = Number(row.mx_amount || 0);
if (!deleteGroupMap[mt]) {
deleteGroupMap[mt] = { mx_moneytype_id: mt, mx_amount_root: 0, mx_amount: 0 };
}
deleteGroupMap[mt].mx_amount_root += rootNet;
deleteGroupMap[mt].mx_amount += amt;
applyFeeRowToGroup(deleteGroupMap, deleteRows[i], 1);
}
var deleteTxtArr = [];
var deleteTotal = 0;
for (var mk in deleteGroupMap) {
var g = deleteGroupMap[mk];
g.mx_amount_root = Math.round(g.mx_amount_root * 1000) / 1000;
g.mx_amount = Math.round(g.mx_amount * 100) / 100;
deleteTxtArr.push(g.mx_moneytype_id + " " + g.mx_amount_root);
deleteTotal += g.mx_amount;
}
var deleteArr = groupMapToArray(deleteGroupMap);
var deleteTotal = calcTotal(deleteArr);
var deleteTxt = buildDisplayText(deleteArr);
deleteTotal = Math.round(deleteTotal * 100) / 100;
var deleteTxt = deleteTxtArr.join(";");
if (deleteTotal !== 0) {
deleteTxt += " 折合金额:" + deleteTotal;
}
@@ -668,59 +671,115 @@
// 计算选中行的金额(仅业务有效行)
function calcw_selfee() {
console.log(gridManager)
if (gridManager.isAllChecked()) {
calcSelfeeAllChecked();
} else {
calcSelfeeNormal();
}
}
function calcSelfeeNormal() {
var rows = gridManager.getValidSelectedRows();
var irow = rows.length;
var moneyArray = [];
var canadd;
for (var i = 0; i < irow; i++) {
//console.log(rows[i]);
var moneytype = rows[i].mx_moneytype_id;
var skamount = 0;
var fkamount = 0;
for (var i = 0; i < rows.length; i++) {
var row = rows[i];
var moneytype = row.mx_moneytype_id;
if (!moneytype) continue;
var alreadyamount = 0;
var notamount = 0;
if (rows[i].mx_type_id == '应收') {
skamount = rows[i].mx_amount_root;
alreadyamount = Number(rows[i].mx_amount_root);
notamount = Number(rows[i].notamount);
if (row.mx_type_id == '应收') {
alreadyamount = Number(row.mx_amount || 0);
notamount = Number(row.notamount || 0);
} else if (row.mx_type_id == '应付') {
alreadyamount = -Number(row.mx_amount || 0);
notamount = -Number(row.notamount || 0);
}
if (rows[i].mx_type_id == '应付') {
fkamount = rows[i].mx_amount_root;
alreadyamount = 0 - Number(rows[i].mx_amount_root);
notamount = 0 - Number(rows[i].notamount);
}
var amount = Number(skamount) - Number(fkamount);
//if(rows[i].mx_type_id=='应收'){
// alreadyamount=Number(alreadyamount);
//}
canadd = true;
for (var k in moneyArray) {
if (moneyArray[k].moneyid == moneytype) {
moneyArray[k].totalamount = moneyArray[k].totalamount + amount;
moneyArray[k].totalalreadyamount = moneyArray[k].totalalreadyamount + alreadyamount;
moneyArray[k].totalnotamount = moneyArray[k].totalnotamount + notamount;
canadd = false;
var existing = moneyArray.find(function (m) {
return m.moneyid == moneytype;
});
if (existing) {
existing.totalalreadyamount += alreadyamount;
existing.totalnotamount += notamount;
} else {
moneyArray.push({ moneyid: moneytype, totalalreadyamount: alreadyamount, totalnotamount: notamount });
}
}
if (canadd) {
moneyArray.push({ moneyid: moneytype, totalamount: amount, totalalreadyamount: alreadyamount, totalnotamount: notamount });
updateSelfeeDisplay(moneyArray);
}
function calcSelfeeAllChecked() {
var excludedRows = gridManager.getExcludedRows();
console.log(excludedRows)
var moneyArray = [];
var tempAmountMap = {};
var tempNotAmountMap = {};
for (var i = 0; i < subSummary.moneyTypes.length; i++) {
var mt = subSummary.moneyTypes[i];
tempAmountMap[mt.mx_moneytype_id] = mt.mx_amount;
}
for (var i = 0; i < subSummary.notMoneyTypes.length; i++) {
var mt = subSummary.notMoneyTypes[i];
tempNotAmountMap[mt.mx_moneytype_id] = mt.mx_amount;
}
for (var i = 0; i < excludedRows.length; i++) {
var row = excludedRows[i];
var mt = row.mx_moneytype_id;
if (!mt) continue;
var amt = Number(row.mx_amount || 0);
if (row.mx_type_id == '应付') amt = -amt;
if (tempAmountMap[mt] !== undefined) {
tempAmountMap[mt] -= amt;
}
var notAmt = Number(row.notamount || 0);
if (row.mx_type_id == '应付') notAmt = -notAmt;
if (tempNotAmountMap[mt] !== undefined) {
tempNotAmountMap[mt] -= notAmt;
}
}
var totaltxt = "";
var allCurrencies = {};
for (var mt in tempAmountMap) allCurrencies[mt] = true;
for (var mt in tempNotAmountMap) allCurrencies[mt] = true;
for (var mt in allCurrencies) {
moneyArray.push({
moneyid: mt,
totalalreadyamount: tempAmountMap[mt] || 0,
totalnotamount: tempNotAmountMap[mt] || 0
});
}
moneyArray.sort(function (a, b) {
return String(a.moneyid).localeCompare(String(b.moneyid));
});
updateSelfeeDisplay(moneyArray);
}
function updateSelfeeDisplay(moneyArray) {
var total_select = "";
var total_selectnotxz = "";
for (var j = 0; j < moneyArray.length; j++) {
//totaltxt=totaltxt+moneyArray[j].moneyid+':'+Math.round((moneyArray[j].totalamount)*100)/100+';';
total_select = total_select + moneyArray[j].moneyid + ':' + Math.round((moneyArray[j].totalalreadyamount) * 100) / 100 + ';';
total_selectnotxz = total_selectnotxz + moneyArray[j].moneyid + ':' + Math.round((moneyArray[j].totalnotamount) * 100) / 100 + ';';
var item = moneyArray[j];
if (item.totalalreadyamount !== 0) {
total_select += item.moneyid + ':' + Math.round(item.totalalreadyamount * 100) / 100 + ';';
}
if (item.totalnotamount !== 0) {
total_selectnotxz += item.moneyid + ':' + Math.round(item.totalnotamount * 100) / 100 + ';';
}
}
//alert(total_select);
//alert(total_selectnotxz);
//$("#div_total").text(totaltxt);
$("#total_select").text(total_select);
$("#total_selectnotxz").text(total_selectnotxz);
}
@@ -1392,7 +1451,6 @@
calcw_fee();
}
// 子表草稿:弹窗选费用 → 写入 insertRows(去重)并刷新当前分页视图
function handleSelectedFee(rows) {
if (rows.length == undefined) {
rows = [rows];
@@ -1403,20 +1461,7 @@
$('#v_dwname').val(rows[0].v_mx_dw_name);
}
for (var i = 0; i < rows.length; i++) {
var r = rows[i];
var rk = gridManager.getDraftManager().getRowKey(r);
var dup = gridManager.getInsertRows().some(function (x) {
return gridManager.getDraftManager().getRowKey(x) === rk;
});
if (!dup) {
if (!r._rowState) {
r._rowState = 'insert';
}
gridManager.addInsertRows(r);
}
}
gridManager.addInsertRows(rows);
gridManager.refreshCurrentPage();
calcw_fee();
}
@@ -1428,105 +1473,28 @@
$.messager.confirm("操作提示", '您确定要删除勾选的费用吗?', function (r) {
if (r) {
endEditing_con();
var selectedRows = gridManager.getValidSelectedRows();
if (selectedRows.length === 0) {
$.messager.alert('提示', '请选择要删除的行(已标记删除的行请使用「撤销删除」)', 'warning');
return;
}
for (var i = selectedRows.length - 1; i >= 0; i--) {
var row = selectedRows[i];
var result = gridManager.deleteSelectedRows(function (row) {
var invoiceno = row.mx_invoiceid;
var kp = invoiceno && invoiceno !== '' && invoiceno !== null ? '1' : '0';
if ((row.alreadyamount != 0) || (kp == '1')) {
$.messager.alert('提示', '已经销账或开票的费用不能删除!', 'warning');
return;
return '已经销账或开票的费用不能删除!';
}
}
var hasInsertDelete = false;
var dm = gridManager.getDraftManager();
for (var i = selectedRows.length - 1; i >= 0; i--) {
var row = selectedRows[i];
if (dm.isInsertRow(row) || dm.isInInsertRows(row)) {
gridManager.removeInsertRow(row);
hasInsertDelete = true;
} else {
var delKey = dm.getRowKey(row);
var wasUpdate = gridManager.getUpdateRows().some(function (rr) {
return dm.getRowKey(rr) === delKey;
return true;
});
row._undoRowState = wasUpdate ? 'update' : '';
row._rowState = 'delete';
gridManager.addDeleteRow(row);
}
}
if (result) {
calcw_fee();
if (hasInsertDelete) {
gridManager.refreshAfterDelete();
} else {
gridManager.refreshDisplay();
}
}
})
}
// 子表草稿:撤销删除(逻辑依赖 selectedRows / getDeletedSelectedRows)
// 子表草稿:撤销删除
function undoRemoveFee() {
endEditing_con();
var pageRows = $('#feegrid').datagrid('getRows');
var targets = [];
var selKeys = {};
var dm = gridManager.getDraftManager();
var selectedRows = gridManager.getSelectedRows();
for (var sk = 0; sk < selectedRows.length; sk++) {
selKeys[dm.getRowKey(selectedRows[sk])] = true;
}
var hasSelectionOnPage = false;
for (var hp = 0; hp < pageRows.length; hp++) {
if (selKeys[dm.getRowKey(pageRows[hp])]) {
hasSelectionOnPage = true;
break;
}
}
if (!hasSelectionOnPage) {
for (var u = 0; u < pageRows.length; u++) {
if (pageRows[u]._rowState === 'delete') {
targets.push(pageRows[u]);
}
}
} else {
var delSel = dm.getDeletedSelectedRows();
var delKeys = {};
for (var dv = 0; dv < delSel.length; dv++) {
delKeys[dm.getRowKey(delSel[dv])] = true;
}
for (var v = 0; v < pageRows.length; v++) {
var pr = pageRows[v];
if (pr._rowState === 'delete' && delKeys[dm.getRowKey(pr)]) {
targets.push(pr);
}
}
}
if (targets.length === 0) {
$.messager.alert('提示', '当前页没有可撤销的删除行', 'warning');
return;
}
for (var w = 0; w < targets.length; w++) {
var row = targets[w];
if (row._rowState !== 'delete') {
continue;
}
gridManager.removeDeleteRow(row);
}
var result = gridManager.undoDeleteSelectedRows();
if (result) {
calcw_fee();
gridManager.refreshAfterUndo();
}
}
// 批量删除
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff