|
|
@@ -67,6 +67,13 @@
|
|
|
max-width: 100%;
|
|
|
height: auto;
|
|
|
}
|
|
|
+
|
|
|
+ .address-input {
|
|
|
+ width: 150px;
|
|
|
+ height: 25px;
|
|
|
+ border: 1px solid #e1e1e1;
|
|
|
+ border-radius: 5px;
|
|
|
+ }
|
|
|
</style>
|
|
|
</asp:Content>
|
|
|
<asp:Content ID="Content2" ContentPlaceHolderID="btn" runat="Server">
|
|
|
@@ -708,22 +715,55 @@
|
|
|
</tr>
|
|
|
</table>
|
|
|
</div>
|
|
|
- <div id="uploaderAddress_win" class="mini-window" title="上传文件地址" style="width: 600px; height: 270px; position: relative; display: none">
|
|
|
+ <div id="uploaderAddress_win" class="mini-window" title="上传文件地址" style="width: 1300px; height: 300px; position: relative; display: none">
|
|
|
<table class="win_tb" border="0" cellpadding="0" cellspacing="1">
|
|
|
<tr>
|
|
|
- <td class="td1"></td>
|
|
|
- <td class="td2">
|
|
|
- <input type="file" id="address_file" accept="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.ms-excel " />
|
|
|
+ <td class="td1">文件地址</td>
|
|
|
+ <td class="td2" colspan="5">
|
|
|
+ <div id="uploader_url"></div>
|
|
|
+ </td>
|
|
|
+ <td class="td2" colspan="5">
|
|
|
+ <a class="mini-button" iconcls="icon-add" onclick="addAddressRow">新增一行</a>
|
|
|
</td>
|
|
|
</tr>
|
|
|
<tr>
|
|
|
- <td class="td1">文件地址</td>
|
|
|
- <td class="td2">
|
|
|
- <div id="uploader_url"></div>
|
|
|
+ <td class="td1">订单号</td>
|
|
|
+ <td class="td1">文件名</td>
|
|
|
+ <td class="td1">数量</td>
|
|
|
+ <td class="td1">备注</td>
|
|
|
+ <td class="td1">省</td>
|
|
|
+ <td class="td1">市</td>
|
|
|
+ <td class="td1">区</td>
|
|
|
+ <td class="td1">地址</td>
|
|
|
+ </tr>
|
|
|
+ <tr id="addressBase">
|
|
|
+ <td class="td1">
|
|
|
+ <input class="address-input" data-name="tid" />
|
|
|
+ </td>
|
|
|
+ <td class="td1">
|
|
|
+ <input class="address-input" data-name="seller_memo" />
|
|
|
+ </td>
|
|
|
+ <td class="td1">
|
|
|
+ <input class="address-input" data-name="number" />
|
|
|
+ </td>
|
|
|
+ <td class="td1">
|
|
|
+ <input class="address-input" data-name="memo" />
|
|
|
+ </td>
|
|
|
+ <td class="td1">
|
|
|
+ <input class="address-input" data-name="province" />
|
|
|
+ </td>
|
|
|
+ <td class="td1">
|
|
|
+ <input class="address-input" data-name="city" />
|
|
|
+ </td>
|
|
|
+ <td class="td1">
|
|
|
+ <input class="address-input" data-name="area" />
|
|
|
+ </td>
|
|
|
+ <td class="td1">
|
|
|
+ <input class="address-input" data-name="address" />
|
|
|
</td>
|
|
|
</tr>
|
|
|
<tr>
|
|
|
- <td colspan="4">
|
|
|
+ <td colspan="8">
|
|
|
<div class="win_btn" style="text-align: center;">
|
|
|
<a class="mini-button" iconcls="icon-ok" onclick="saveUploaderAddressFn">确定</a>
|
|
|
<a class="mini-button" iconcls="icon-cancel" onclick="cancelUploaderAddressFn">取消</a>
|
|
|
@@ -905,7 +945,7 @@
|
|
|
async function putObject(file) {
|
|
|
try {
|
|
|
let fileDir = dateFtt("yyyyMMdd", new Date())
|
|
|
- let name = "addressDoc/" + fileDir + "/" + guid() + getSuff(file.name);
|
|
|
+ let name = "addressDoc/" + fileDir + "/" + guid() + ".xlsx";
|
|
|
// 填写Object完整路径。Object完整路径中不能包含Bucket名称。
|
|
|
// 您可以通过自定义文件名(例如exampleobject.txt)或文件完整路径(例如exampledir/exampleobject.txt)的形式实现将数据上传到当前Bucket或Bucket中的指定目录。
|
|
|
// data对象可以自定义为file对象、Blob数据或者OSS Buffer。
|
|
|
@@ -913,15 +953,15 @@
|
|
|
headers: { "Content-Type": "text/plain" },
|
|
|
};
|
|
|
const result = await client.put(name, file, options);
|
|
|
- $("#uploader_url").text(result.url);
|
|
|
+ return result.url;
|
|
|
} catch (e) {
|
|
|
console.log(e);
|
|
|
}
|
|
|
}
|
|
|
- document.getElementById('address_file').addEventListener('change', function (e) {
|
|
|
+ /*document.getElementById('address_file').addEventListener('change', function (e) {
|
|
|
const file = e.target?.files[0];
|
|
|
const reader = new FileReader();
|
|
|
- /*reader.onload = function (option) {
|
|
|
+ reader.onload = function (option) {
|
|
|
const data = new Uint8Array(option.target.result);
|
|
|
const workbook = XLSX.read(data, { type: 'array' });
|
|
|
const sheetName = workbook.SheetNames[0]; // 获取第一个工作表的名称
|
|
|
@@ -944,31 +984,112 @@
|
|
|
resultShow("请上传正确的文件");
|
|
|
}
|
|
|
};
|
|
|
- reader.readAsArrayBuffer(file);*/
|
|
|
+ reader.readAsArrayBuffer(file);
|
|
|
putObject(file);
|
|
|
- });
|
|
|
-
|
|
|
+ });*/
|
|
|
+ let tagIds = [];
|
|
|
+ let tagId = 0;
|
|
|
let uploaderAddressTid = "";
|
|
|
function uploaderAddress(tid) {
|
|
|
uploaderAddressTid = tid;
|
|
|
- document.getElementById('address_file').value = "";
|
|
|
+ //document.getElementById('address_file').value = "";
|
|
|
$("#uploader_url").text("");
|
|
|
-
|
|
|
+ tagIds.forEach((item) => {
|
|
|
+ $("#" + item).remove();
|
|
|
+ })
|
|
|
+ tagIds = [];
|
|
|
+ tagId = 0;
|
|
|
postAjax("get_tid_attachments", { tid }, function (data) {
|
|
|
maskHide();
|
|
|
mini.get("uploaderAddress_win").show();
|
|
|
+ $("#uploaderAddress_win input").val("");
|
|
|
if (!!data.url) {
|
|
|
$("#uploader_url").text(data.url);
|
|
|
}
|
|
|
})
|
|
|
|
|
|
}
|
|
|
- function saveUploaderAddressFn() {
|
|
|
- let params = { tid: uploaderAddressTid, atta: $("#uploader_url").text() };
|
|
|
- postAjax("set_tid_attachments", params, function (data) {
|
|
|
- resultShow(data, "grid.reload();");
|
|
|
- mini.get("uploaderAddress_win").hide();
|
|
|
- });
|
|
|
+ async function saveUploaderAddressFn() {
|
|
|
+ const trs = document.getElementById("uploaderAddress_win").querySelectorAll("tr");
|
|
|
+ let list = [];
|
|
|
+ let data_list = [["订单号", "文件名", "数量", "省", "市", "区", "地址", "备注"]];
|
|
|
+ trs.forEach(tr => {
|
|
|
+ let rows = {};
|
|
|
+ let inputs = tr.querySelectorAll("td input");
|
|
|
+ if (inputs.length > 0) {
|
|
|
+ inputs.forEach(item => {
|
|
|
+ let name = item.dataset.name;
|
|
|
+ let value = item.value;
|
|
|
+ rows[name] = value;
|
|
|
+ })
|
|
|
+ list.push(rows);
|
|
|
+ }
|
|
|
+
|
|
|
+ })
|
|
|
+
|
|
|
+ let isAll = true;
|
|
|
+ for (let i = 0; i < list.length; i++) {
|
|
|
+ let data_row = list[i];
|
|
|
+ let { tid, seller_memo, number, memo, province, city, area, address } = list[i];
|
|
|
+ if (Object.keys(data_row).filter(value => { return data_row[value] == "" }).length == data_row.length) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ if (!tid || !seller_memo || !number || !province || !city || !area || !address) {
|
|
|
+ isAll = false;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ data_list.push([tid, seller_memo, number, memo, province, city, area, address]);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (data_list.length == 1) {
|
|
|
+ isAll = false;
|
|
|
+ }
|
|
|
+ if (!isAll) {
|
|
|
+ return mini.showTips({
|
|
|
+ content: "请填写完整信息!",
|
|
|
+ state: "danger",
|
|
|
+ x: "Center",
|
|
|
+ y: "Center",
|
|
|
+ timeout: 1000
|
|
|
+ });
|
|
|
+ }
|
|
|
+ let result = await createXlsx(data_list);
|
|
|
+ if (!result) {
|
|
|
+ return mini.showTips({
|
|
|
+ content: "上传文件失败!",
|
|
|
+ state: "danger",
|
|
|
+ x: "Center",
|
|
|
+ y: "Center",
|
|
|
+ timeout: 1000
|
|
|
+ });
|
|
|
+ }
|
|
|
+ let params = { tid: uploaderAddressTid, atta: result };
|
|
|
+ postAjax("set_tid_attachments", params, function (data) {
|
|
|
+ resultShow(data, "grid.reload();");
|
|
|
+ mini.get("uploaderAddress_win").hide();
|
|
|
+ });
|
|
|
+ }
|
|
|
+ async function createXlsx(data) {
|
|
|
+ const wb = XLSX.utils.book_new();
|
|
|
+
|
|
|
+ // 将数据转换为工作表对象
|
|
|
+ const ws = XLSX.utils.aoa_to_sheet(data);
|
|
|
+
|
|
|
+ // 将工作表添加到工作簿中
|
|
|
+ XLSX.utils.book_append_sheet(wb, ws, "Sheet1");
|
|
|
+
|
|
|
+ const wbout = XLSX.write(wb, { bookType: 'xlsx', type: 'binary' });
|
|
|
+
|
|
|
+ // 创建一个 Blob 对象并创建一个 URL
|
|
|
+ function s2ab(s) {
|
|
|
+ const buffer = new ArrayBuffer(s.length);
|
|
|
+ const view = new Uint8Array(buffer);
|
|
|
+ for (let i = 0; i < s.length; i++) view[i] = s.charCodeAt(i) & 0xFF;
|
|
|
+ return buffer;
|
|
|
+ }
|
|
|
+ const blob = new Blob([s2ab(wbout)], { type: "application/octet-stream" });
|
|
|
+ let result = await putObject(blob)
|
|
|
+ return result;
|
|
|
}
|
|
|
|
|
|
function cancelUploaderAddressFn() {
|
|
|
@@ -1007,6 +1128,40 @@
|
|
|
});
|
|
|
}
|
|
|
|
|
|
+ function addAddressRow() {
|
|
|
+ let trId = `baseAddress_${tagId}`
|
|
|
+ let html = ` <tr id="${trId}">
|
|
|
+ <td class="td1">
|
|
|
+ <input class="address-input" data-name="tid" />
|
|
|
+ </td>
|
|
|
+ <td class="td1">
|
|
|
+ <input class="address-input" data-name="seller_memo" />
|
|
|
+ </td>
|
|
|
+ <td class="td1">
|
|
|
+ <input class="address-input" data-name="number" />
|
|
|
+ </td>
|
|
|
+ <td class="td1">
|
|
|
+ <input class="address-input" data-name="memo" />
|
|
|
+ </td>
|
|
|
+ <td class="td1">
|
|
|
+ <input class="address-input" data-name="province" />
|
|
|
+ </td>
|
|
|
+ <td class="td1">
|
|
|
+ <input class="address-input" data-name="city" />
|
|
|
+ </td>
|
|
|
+ <td class="td1">
|
|
|
+ <input class="address-input" data-name="area" />
|
|
|
+ </td>
|
|
|
+ <td class="td1">
|
|
|
+ <input class="address-input" data-name="address" />
|
|
|
+ </td>
|
|
|
+ </tr>`
|
|
|
+ let addressBase = document.getElementById("addressBase");
|
|
|
+ addressBase.insertAdjacentHTML('afterend', html);
|
|
|
+ tagId++;
|
|
|
+ tagIds.push(trId);
|
|
|
+ }
|
|
|
+
|
|
|
</script>
|
|
|
|
|
|
<div class="image_large" onclick="hideImage(this)"></div>
|