接口优化

This commit is contained in:
BianLzhaoMin 2026-02-10 09:17:24 +08:00
parent 5c796f418e
commit 99a83d9374
7 changed files with 234 additions and 74 deletions

View File

@ -1,5 +1,5 @@
// 全局变量
const API_BASE_URL = commonService+'/backstage/';
const API_BASE_URL = commonService + '/backstage/';
const API_ENDPOINT = 'purchase/getProPurchaseList';
let token = localStorage.getItem("safetyToken");
console.log('safetyPlanShipment.js - 初始化从localStorage获取safetyToken:', token);
@ -34,11 +34,11 @@ function loadProjectList(pageNum) {
type: 'GET',
url: url,
dataType: 'json',
beforeSend: function(xhr) {
beforeSend: function (xhr) {
xhr.setRequestHeader('Authorization', token);
console.log('📤 设置Authorization header:', token ? '已设置' : '未设置');
},
success: function(response) {
success: function (response) {
showLoading(false);
console.log('✅ API响应成功');
console.log('完整响应:', JSON.stringify(response, null, 2));
@ -64,7 +64,7 @@ function loadProjectList(pageNum) {
showEmpty(true);
}
},
error: function(xhr, errorStatus, error) {
error: function (xhr, errorStatus, error) {
showLoading(false);
console.error('❌ API请求失败');
console.error('状态码:', xhr.status);
@ -80,7 +80,7 @@ function loadProjectList(pageNum) {
// 渲染工程列表
function renderProjectList(projects) {
const projectList = document.getElementById('projectList');
if (!projects || projects.length === 0) {
showEmpty(true);
return;
@ -212,7 +212,8 @@ function showEmpty(show) {
// 返回上一页
function goBack() {
window.location.href = 'safetyPlanIndex.html';
// window.location.href = 'safetyPlanIndex.html';
window.location.href = '../index.html';
}
// 进入工程详情第2层

View File

@ -1,5 +1,6 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
@ -7,6 +8,7 @@
<script src="../part/jquery-2.0.3.min.js" type="text/javascript" charset="utf-8"></script>
<link rel="stylesheet" href="safetyPlanShipmentDetail.css">
</head>
<body>
<div class="detail-container">
<!-- 头部 -->
@ -64,5 +66,5 @@
<script src="../../js/public.js"></script>
<script src="safetyPlanShipmentDetail.js"></script>
</body>
</html>
</html>

View File

@ -1,5 +1,5 @@
// 全局变量
const API_BASE_URL = commonService+'/backstage/';
const API_BASE_URL = commonService + '/backstage/';
const API_ENDPOINT = 'purchase/getProApplyList';
let token = localStorage.getItem("safetyToken");
console.log('safetyPlanShipmentDetail.js - 初始化从localStorage获取safetyToken:', token);
@ -7,16 +7,18 @@ let currentPage = 1;
let pageSize = 20;
let proId = null;
let projectName = '';
let status = null; // 状态参数
let allPlans = []; // 存储所有计划数据用于搜索
let filteredPlans = []; // 存储过滤后的数据
let currentStatusFilter = ''; // 当前状态筛选
// 页面加载
document.addEventListener('DOMContentLoaded', () => {
// 从URL获取proId
// 从URL获取proId、projectName和status
const urlParams = new URLSearchParams(window.location.search);
proId = urlParams.get('proId');
projectName = urlParams.get('projectName') || '';
status = urlParams.get('status');
if (!proId) {
alert('缺少工程ID参数');
@ -57,11 +59,11 @@ function loadPlanList(pageNum) {
type: 'GET',
url: url,
dataType: 'json',
beforeSend: function(xhr) {
beforeSend: function (xhr) {
xhr.setRequestHeader('Authorization', token);
console.log('📤 设置Authorization header:', token ? '已设置' : '未设置');
},
success: function(response) {
success: function (response) {
showLoading(false);
console.log('✅ API响应成功');
console.log('完整响应:', JSON.stringify(response, null, 2));
@ -89,7 +91,7 @@ function loadPlanList(pageNum) {
showEmpty(true);
}
},
error: function(xhr, status, error) {
error: function (xhr, status, error) {
showLoading(false);
console.error('❌ API请求失败');
console.error('状态码:', xhr.status);
@ -111,7 +113,7 @@ function loadPlanList(pageNum) {
// 渲染需求计划列表
function renderPlanList(plans) {
const planList = document.getElementById('planList');
if (!plans || plans.length === 0) {
showEmpty(true);
return;
@ -130,17 +132,29 @@ function renderPlanList(plans) {
function createPlanCard(plan) {
const card = document.createElement('div');
card.className = 'plan-card';
card.onclick = () => goToPlanDetail(plan.id);
const status = determinePlanStatus(plan);
const planStatus = determinePlanStatus(plan);
// 卡片点击时传递status参数优先使用URL中的status如果没有则使用计划的状态
card.onclick = () => goToPlanDetail(plan.id, status || planStatus);
const progress = calculateProgress(plan);
const lkNum = plan.lkNum || 0;
const needNum = plan.needNum || 0;
// 根据状态判断按钮文本
let buttonText = '发货';
if (planStatus === '已发货') {
buttonText = '详情';
} else if (planStatus === '部分发货') {
buttonText = '补发货';
} else if (planStatus === '待发货') {
buttonText = '发货';
}
card.innerHTML = `
<div class="plan-card-header">
<div class="plan-code">${plan.planCode}</div>
<div class="plan-status status-${status}">${status}</div>
<div class="plan-status status-${planStatus}">${planStatus}</div>
</div>
<div class="plan-info">
<div class="info-item">
@ -166,10 +180,18 @@ function createPlanCard(plan) {
</div>
<div class="progress-text">已发货: ${lkNum}/${needNum}</div>
</div>
<button class="action-btn" onclick="event.stopPropagation(); goToPlanDetail('${plan.id}')">发货</button>
<button class="action-btn">${buttonText}</button>
</div>
`;
// 为按钮添加点击事件,阻止事件冒泡
const button = card.querySelector('.action-btn');
button.addEventListener('click', function (e) {
e.stopPropagation();
// 按钮点击传递计划的状态
goToPlanDetail(plan.id, planStatus);
});
return card;
}
@ -232,17 +254,17 @@ function renderPagination(response) {
// 搜索计划
function searchPlans() {
const searchText = document.querySelector('.search-input').value.toLowerCase();
filteredPlans = allPlans.filter(plan =>
filteredPlans = allPlans.filter(plan =>
plan.planCode.toLowerCase().includes(searchText)
);
// 应用状态筛选
if (currentStatusFilter) {
filteredPlans = filteredPlans.filter(plan =>
filteredPlans = filteredPlans.filter(plan =>
determinePlanStatus(plan) === currentStatusFilter
);
}
renderPlanList(filteredPlans);
}
@ -250,23 +272,23 @@ function searchPlans() {
function filterByStatus() {
const statusFilter = document.getElementById('statusFilter').value;
currentStatusFilter = statusFilter;
filteredPlans = allPlans;
if (statusFilter) {
filteredPlans = filteredPlans.filter(plan =>
filteredPlans = filteredPlans.filter(plan =>
determinePlanStatus(plan) === statusFilter
);
}
// 应用搜索文本
const searchText = document.querySelector('.search-input').value.toLowerCase();
if (searchText) {
filteredPlans = filteredPlans.filter(plan =>
filteredPlans = filteredPlans.filter(plan =>
plan.planCode.toLowerCase().includes(searchText)
);
}
renderPlanList(filteredPlans);
}
@ -296,7 +318,11 @@ function goBack() {
}
// 进入计划详情第3层
function goToPlanDetail(planId) {
window.location.href = `safetyPlanShipmentItem.html?planId=${planId}&proId=${proId}`;
function goToPlanDetail(planId, status) {
let url = `safetyPlanShipmentItem.html?planId=${planId}&proId=${proId}`;
if (status) {
url += `&status=${encodeURIComponent(status)}`;
}
window.location.href = url;
}

View File

@ -1,5 +1,6 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
@ -7,6 +8,7 @@
<script src="../part/jquery-2.0.3.min.js" type="text/javascript" charset="utf-8"></script>
<link rel="stylesheet" href="safetyPlanShipmentItem.css">
</head>
<body>
<div class="item-container">
<!-- 头部 -->
@ -81,5 +83,5 @@
<script src="../../js/public.js"></script>
<script src="safetyPlanShipmentItem.js"></script>
</body>
</html>
</html>

View File

@ -1,20 +1,24 @@
// 全局变量
const API_BASE_URL = commonService+'/';
const API_BASE_URL = commonService + '/';
const GET_DETAILS_ENDPOINT = 'backstage/purchase/getOutApplyDetails';
const SUBMIT_SHIPMENT_ENDPOINT = 'backstage/purchase/addPurchaseData';
const SUBMIT_SHIPMENT_ENDPOINT = 'backstage/purchase/addPurchaseData'; // 正常发货接口
const SUBMIT_SHIPMENT_ENDPOINT_BUFFER = 'backstage/purchase/addPurchaseDataBySupplement'; // 部分发货时 补发货接口
let token = localStorage.getItem("safetyToken");
console.log('safetyPlanShipmentItem.js - 初始化从localStorage获取safetyToken:', token);
let planId = null;
let proId = null;
let status = null; // 状态参数
let planDetails = null; // 存储计划详情
let shipmentDetails = []; // 存储发货明细
let newOutStatus = null; // 新的outStatus
// 页面加载
document.addEventListener('DOMContentLoaded', () => {
// 从URL获取planId和proId
// 从URL获取planId、proId和status
const urlParams = new URLSearchParams(window.location.search);
planId = urlParams.get('planId');
proId = urlParams.get('proId');
status = urlParams.get('status');
if (!planId) {
alert('缺少计划ID参数');
@ -50,11 +54,11 @@ function loadPlanDetails() {
dataType: 'json',
contentType: 'application/x-www-form-urlencoded; charset=UTF-8',
data: 'encryptedData=' + encodeURIComponent(JSON.stringify(encryptedData)),
beforeSend: function(xhr) {
beforeSend: function (xhr) {
xhr.setRequestHeader('Authorization', token);
console.log('📤 设置Authorization header:', token ? '已设置' : '未设置');
},
success: function(response) {
success: function (response) {
showLoading(false);
console.log('✅ API响应成功');
console.log('完整响应:', JSON.stringify(response, null, 2));
@ -75,6 +79,8 @@ function loadPlanDetails() {
renderPlanInfo();
renderDetailsList();
initShipmentDetails();
// 根据status处理表单和输入框的禁用状态
handleStatusBasedUI();
} else {
console.warn('❌ No data found in response');
console.warn('响应内容:', JSON.stringify(response, null, 2));
@ -82,7 +88,7 @@ function loadPlanDetails() {
goBack();
}
},
error: function(xhr, status, error) {
error: function (xhr, status, error) {
showLoading(false);
console.error('❌ API请求失败');
console.error('状态码:', xhr.status);
@ -117,6 +123,34 @@ function renderPlanInfo() {
return;
}
// 格式化日期时间如果outTime是时间戳或其他格式需要转换
let displayTime = data.outTime || data.applyTime || '-';
if (displayTime !== '-') {
// 如果是时间戳,转换为可读格式
if (typeof displayTime === 'number' || /^\d+$/.test(displayTime)) {
const date = new Date(parseInt(displayTime));
displayTime = date.toLocaleString('zh-CN', {
year: 'numeric',
month: '2-digit',
day: '2-digit',
hour: '2-digit',
minute: '2-digit',
second: '2-digit'
});
} else if (displayTime.includes('T')) {
// 如果是ISO格式转换为可读格式
const date = new Date(displayTime);
displayTime = date.toLocaleString('zh-CN', {
year: 'numeric',
month: '2-digit',
day: '2-digit',
hour: '2-digit',
minute: '2-digit',
second: '2-digit'
});
}
}
infoGrid.innerHTML = `
<div class="info-item">
<div class="info-label">计划编号</div>
@ -124,11 +158,11 @@ function renderPlanInfo() {
</div>
<div class="info-item">
<div class="info-label">申请人</div>
<div class="info-value">${data.userName || '-'}</div>
<div class="info-value">${data.creator || '-'}</div>
</div>
<div class="info-item">
<div class="info-label">申请时间</div>
<div class="info-value">${data.applyTime || '-'}</div>
<div class="info-value">${data.createTime || '-'}</div>
</div>
`;
console.log('✅ renderPlanInfo - 渲染完成');
@ -159,7 +193,7 @@ function renderDetailsList() {
const needNum = item.needNum ? parseInt(item.needNum) : 0;
const pendingNum = needNum - lkNum;
console.log("数量:"+lkNum+"needNum:");
console.log("数量:" + lkNum + "needNum:");
const card = document.createElement('div');
card.className = 'detail-card';
card.innerHTML = `
@ -211,6 +245,82 @@ function renderDetailsList() {
console.log('✅ renderDetailsList - 渲染完成,共', list.length, '条数据');
}
// 根据状态处理UI的禁用和显示
function handleStatusBasedUI() {
if (!status) {
return; // 如果没有status参数不处理
}
const data = planDetails.data || {};
const outStatus = data.outStatus;
newOutStatus = outStatus;
// 如果状态为"已发货"
if (status === '已发货') {
// 禁用所有发货数量输入框
const shipmentInputs = document.querySelectorAll('.shipment-input');
shipmentInputs.forEach(input => {
input.disabled = true;
});
// 禁用发货信息表单
document.getElementById('fhDay').disabled = true;
document.getElementById('jbUser').disabled = true;
document.getElementById('address').disabled = true;
document.getElementById('remark').disabled = true;
// 隐藏提交发货按钮
const submitBtn = document.querySelector('.btn-primary');
if (submitBtn) {
submitBtn.style.display = 'none';
}
}
// 如果状态为"待发货"或"部分发货"
else if (status === '待发货' || status === '部分发货') {
// 如果outStatus为1禁用表单并回填数据
if (outStatus == 1) {
// 禁用发货信息表单
document.getElementById('fhDay').disabled = true;
document.getElementById('jbUser').disabled = true;
document.getElementById('address').disabled = true;
document.getElementById('remark').disabled = true;
// 回填表单数据
if (data.outTime) {
// 格式化日期如果outTime是时间戳或其他格式需要转换
let dateValue = data.outTime;
// 如果是时间戳转换为YYYY-MM-DD格式
if (typeof dateValue === 'number' || /^\d+$/.test(dateValue)) {
const date = new Date(parseInt(dateValue));
dateValue = date.toISOString().split('T')[0];
} else if (dateValue.includes(' ')) {
// 如果是日期时间字符串,只取日期部分
dateValue = dateValue.split(' ')[0];
}
document.getElementById('fhDay').value = dateValue;
}
if (data.manager) {
document.getElementById('jbUser').value = data.manager;
}
if (data.address) {
document.getElementById('address').value = data.address;
}
if (data.remark) {
document.getElementById('remark').value = data.remark;
}
}
// 如果outStatus为0表单无需禁用保持默认状态
// 如果status为"部分发货"且outStatus==1修改按钮文本为"补充发货"
if (status === '部分发货' && outStatus == 1) {
const submitBtn = document.querySelector('.btn-primary');
if (submitBtn) {
submitBtn.textContent = '补充发货';
}
}
}
}
// 初始化发货明细
function initShipmentDetails() {
const list = planDetails.list || [];
@ -264,6 +374,7 @@ function submitShipment() {
const detailsList = [];
const list = planDetails.list || [];
let totalShipmentNum = 0;
console.log('newOutStatus--list:', list);
list.forEach(item => {
const inputElement = document.getElementById(`shipment_${item.detailId}`);
@ -292,7 +403,7 @@ function submitShipment() {
const detail = {
modelId: item.modelId,
planId: item.planId,
detailId: item.detailId,
// detailId: item.detailId,
type: item.type,
name: item.name,
model: item.model,
@ -312,6 +423,12 @@ function submitShipment() {
contractId: ''
}]
};
if (status === '部分发货' && newOutStatus == 1) {
detail.id = item.id;
} else {
detail.detailId = item.detailId;
}
detailsList.push(detail);
}
});
@ -340,6 +457,12 @@ function submitShipmentToServer(detailsList, fhDay, jbUser, address, remark) {
showSubmitLoading(true);
const planCode = planDetails.data.planCode;
const outStatus = planDetails.data.outStatus;
// 判断使用哪个接口当status为"部分发货"且outStatus==1时使用补发货接口
const endpoint = (status === '部分发货' && outStatus == 1)
? SUBMIT_SHIPMENT_ENDPOINT_BUFFER
: SUBMIT_SHIPMENT_ENDPOINT;
const submitData = {
planCode: planCode,
@ -352,23 +475,29 @@ function submitShipmentToServer(detailsList, fhDay, jbUser, address, remark) {
proId: proId
};
if (status === '部分发货' && newOutStatus == 1) {
submitData.id = planDetails.data.id;
}
console.log('========== safetyPlanShipmentItem.js - 提交发货 ==========');
console.log('请求URL:', API_BASE_URL + SUBMIT_SHIPMENT_ENDPOINT);
console.log('状态判断 - status:', status, ', outStatus:', outStatus);
console.log('使用的接口:', endpoint);
console.log('请求URL:', API_BASE_URL + endpoint);
console.log('请求数据:', JSON.stringify(submitData, null, 2));
console.log('请求Headers:', { 'Authorization': token ? '已设置' : '未设置' });
console.log('Token值:', token);
$.ajax({
type: 'POST',
url: API_BASE_URL + SUBMIT_SHIPMENT_ENDPOINT,
url: API_BASE_URL + endpoint,
dataType: 'json',
contentType: 'application/x-www-form-urlencoded; charset=UTF-8',
data: 'params=' + encodeURIComponent(JSON.stringify(submitData)),
beforeSend: function(xhr) {
beforeSend: function (xhr) {
xhr.setRequestHeader('Authorization', token);
console.log('📤 设置Authorization header:', token ? '已设置' : '未设置');
},
success: function(response) {
success: function (response) {
showSubmitLoading(false);
console.log('✅ API响应成功');
console.log('完整响应:', JSON.stringify(response, null, 2));
@ -379,7 +508,7 @@ function submitShipmentToServer(detailsList, fhDay, jbUser, address, remark) {
alert('发货失败: ' + (response.msg || response.message || '未知错误'));
}
},
error: function(xhr, errorStatus, error) {
error: function (xhr, errorStatus, error) {
showSubmitLoading(false);
console.error('❌ API请求失败');
console.error('状态码:', xhr.status);

View File

@ -1,39 +1,39 @@
//localStorage.setItem("url", "http://10.1.0.142:1935/gz_imw")
localStorage.setItem("url", "http://192.168.0.38:8080/GZMachinesWeb")
localStorage.setItem("url", "http://192.168.0.133:8080/GZMachinesWeb")
//localStorage.setItem("url", "http://192.168.8.103:8080/gz_imw")
//localStorage.setItem("url", "http://172.20.10.3:8080/GZMachinesWeb");
//localStorage.setItem("url", "http://36.33.26.177:1356/GZMachinesWeb");
//localStorage.setItem("url", "http://10.1.0.142:1935/GZMachinesWeb");
$(function() {
onDeviceReady();
$(function () {
onDeviceReady();
});
function onDeviceReady() {
deviceReady = true;
dataBase = openDatabase("ImtMachineWeb", "", "工作簿", 1024 * 1024, function() {});
if(!dataBase) {
alert("数据库创建失败!");
} else {
create(dataBase);
}
deviceReady = true;
dataBase = openDatabase("ImtMachineWeb", "", "工作簿", 1024 * 1024, function () { });
if (!dataBase) {
alert("数据库创建失败!");
} else {
create(dataBase);
}
}
function create(dataBase) {
dataBase.transaction(function(tx) {
tx.executeSql(
"CREATE TABLE IF NOT EXISTS BM_USER(ID INT(11) NOT NULL," +
"NAME VARCHAR(50)," +
"PASSWORD VARCAHR(50)," +
"POST_ID INT(11)," + //职位ID
"LOGIN_NAME VARCAHR(50)," +
"ORG_ID INT(11),"+
"LOGGED VARCHAR(10)," +
"PRIMARY KEY (ID))", [],
function(tx, result) {
},
function(tx, error) {
alert('创建BM_USER表失败:' + error.message);
}
);
})
dataBase.transaction(function (tx) {
tx.executeSql(
"CREATE TABLE IF NOT EXISTS BM_USER(ID INT(11) NOT NULL," +
"NAME VARCHAR(50)," +
"PASSWORD VARCAHR(50)," +
"POST_ID INT(11)," + //职位ID
"LOGIN_NAME VARCAHR(50)," +
"ORG_ID INT(11)," +
"LOGGED VARCHAR(10)," +
"PRIMARY KEY (ID))", [],
function (tx, result) {
},
function (tx, error) {
alert('创建BM_USER表失败:' + error.message);
}
);
})
}

View File

@ -1,5 +1,5 @@
const commonIp = "http://192.168.0.38:21520";
const commonService = commonIp+"/gz-aqgqj";
const commonIp = "http://192.168.0.133:21520";
const commonService = commonIp + "/gz-aqgqj";