Commit 4e86efe9 authored by 刘燕芳's avatar 刘燕芳

获取登录信息

parent edf02d3b
No preview for this file type
...@@ -5,12 +5,16 @@ ...@@ -5,12 +5,16 @@
"manifest_version": 2, "manifest_version": 2,
"background": { "background": {
"scripts": ["background.js"] "scripts": ["background.js"],
"_scripts": [
"src/background/index.ts"
],
"persistent": true
}, },
"browser_action": { "browser_action": {
"default_popup": "popup.html", "default_popup": "popup.html",
"default_icon": "icon.png", "default_icon": "icon.png",
"default_title": "辅助图动力" "default_title": "辅助发货易打单"
}, },
"icons": { "icons": {
"128": "icon.png" "128": "icon.png"
...@@ -21,7 +25,7 @@ ...@@ -21,7 +25,7 @@
"content_scripts": [ "content_scripts": [
{ {
"matches": [ "matches": [
"*://*.fahuoyi.com/*", "*://myseller.taobao.com/*",
"*://admin.rtxmdz.com/*", "*://admin.rtxmdz.com/*",
"http://localhost:8082/*", "http://localhost:8082/*",
"http://localhost:8083/*", "http://localhost:8083/*",
......
{ {
"name": "linkfahuoyi-exension", "name": "linkfahuoyi-exension",
"version": "1.0.0", "version": "1.0.0",
"main": "index.js", "main": "index.ts",
"license": "MIT", "license": "MIT",
"scripts": { "scripts": {
"dev": "cross-env NODE_ENV=development webpack --config ./webpack/webpack.dev.js --watch", "dev": "cross-env NODE_ENV=development webpack --config ./webpack/webpack.dev.js --watch",
......
import { factoryContentUrls,bookingV2Urls, bookingAppUrls } from "../config"; import { factoryContentUrls,bookingV2Urls,homeUrl,tmIssueUrl,tbIssueUrl } from "../config";
import { StartPrint, Print, ACTION } from "../types"; import { StartPrint, Print, ACTION } from "../types";
const tmNameSiffix = ['旗舰店', '专卖店', '专营店']
// platform: PlatformCode,// 平台编码,淘系及其他平台订单模板的为0,拼多多订单的为1,京东订单的为2 // platform: PlatformCode,// 平台编码,淘系及其他平台订单模板的为0,拼多多订单的为1,京东订单的为2
const PlatfromsMap = new Map([ const PlatfromsMap = new Map([
[0, /.+:\/\/a.*\.fahuoyi.com\/scanPrinting\/index/], [0, /.+:\/\/a.*\.fahuoyi.com\/scanPrinting\/index/],
[1, /.+:\/\/pdd.*\.fahuoyi.com\/scanPrinting\/index/], [1, /.+:\/\/pdd.*\.fahuoyi.com\/scanPrinting\/index/],
[2, /.+:\/\/jd.*\.fahuoyi.com\/scanPrinting\/index/] [2, /.+:\/\/jd.*\.fahuoyi.com\/scanPrinting\/index/]
]) ])
let monitoringRemoveTabId = new Map();
chrome.runtime.onMessage.addListener(function (message, sender, sendResponse) { chrome.runtime.onMessage.addListener(function (message, sender, sendResponse) {
if (message.action === StartPrint) { if (message.action === StartPrint) {
...@@ -76,15 +77,135 @@ chrome.runtime.onMessage.addListener(function (message, sender, sendResponse) { ...@@ -76,15 +77,135 @@ chrome.runtime.onMessage.addListener(function (message, sender, sendResponse) {
}) })
}) })
if(tabs.length==0){ if(tabs.length==0){
alert('请打开新版发货易发货页面')
sendResponse({status:1,msg:"请打开新版发货易发货页面"}); sendResponse({status:1,msg:"请打开新版发货易发货页面"});
} }
}) })
// let port = chrome.runtime.connect({ name: "bgSendMessage" }) // let port = chrome.runtime.connect({ name: "bgSendMessage" })
// port.postMessage(message) // port.postMessage(message)
}else if(message.action==='getUserLoginData'){
getUserLoginData()
chrome.tabs.onUpdated.addListener(async (tabId, changeInfo, tab) => {
//加载完毕后在执行一些动作
if (tab.status== "complete") {
//如果进入了千牛首页 则开始获取对应的数据信息
if(tab.url&&tab.url.indexOf("loginmyseller.taobao.com") != -1){
chrome.storage.sync.remove("tb_user")
sendResponse();
return
}
if (tab.url&&tab.url.indexOf("myseller.taobao.com/home.htm/QnworkbenchHome") != -1) {
let userNickCookie:any = await getCookies(tab.url, "sn");
if (userNickCookie === null || userNickCookie === undefined || userNickCookie === "") userNickCookie = await getCookies(tab.url, "_nk_");
console.log('userNickCookie',userNickCookie);
if (userNickCookie === null || userNickCookie === undefined) {
chrome.storage.sync.remove("tb_user")
sendResponse();
return
};
let tuDe1 = decodeURI(userNickCookie.value);
let tuDe2 = unescape(tuDe1.replace(/\\(u[0-9a-fA-F]{4})/gm, '%$1'));
if (tuDe2.indexOf(":") != -1) tuDe2 = tuDe2.split(":")[0];
let createUrl = isTm(tuDe2) ? tmIssueUrl : tbIssueUrl;
let tabId = await createTab(createUrl);
monitoringRemoveTabId.set(tabId, tuDe2);
}
if (tab.url&&(tab.url.indexOf("item.upload.taobao.com/sell/merge") != -1 || tab.url.indexOf("sell.publish.tmall.com/tmall/smart") != -1)) {
if (monitoringRemoveTabId.has(tab.id)) {
let userNick:string = monitoringRemoveTabId.get(tab.id);
let cookie = await getCookieAll(tab.url);
let token:any = await getCookies(tab.url, "XSRF-TOKEN");
let userData:object = {
cookie:cookie,
token: token.value,
userNick: userNick,
}
console.log("user data :", userData,new Date().getMinutes(),new Date().getSeconds());
// let serverNum = SoketDispatchManage.hosts[config.evn].length;
// if (SoketDispatchManage.userNick == null || SoketDispatchManage.userNick != userData.userNick || SoketDispatchManage.getActiveConnectNum() != serverNum) {
// //与服务器建立webSocket连接 后续与服务器通信将依赖此链接
// SoketDispatchManage.connection(userData.userNick);
// if (SoketDispatchManage.getActiveConnectNum() <= 0) {
// console.log("socket未连接至任何服务器!")
// }
// }
let id:any = tab.id
chrome.storage.sync.set({"tb_user":JSON.stringify(userData)})
sendResponse();
}else{
console.log(222,new Date().getMinutes(),new Date().getSeconds());
chrome.storage.sync.remove("tb_user")
sendResponse();
}
}
if(monitoringRemoveTabId.has(tab.id)){
let id:any = tab.id
chrome.tabs.remove(id);
}
}
})
} }
return true; return true;
}) })
// chrome.runtime.onConnect.addListener(function (msg) {
// console.log(msg, 'msgbg')
// }) async function getUserLoginData(){
\ No newline at end of file let tabId = await createTab(homeUrl);
monitoringRemoveTabId.set(tabId, "");
}
async function createTab(url:string) {
return new Promise((resolve, reject) => {
chrome.tabs.create({ url: url, active: false }, async (tab) => {
resolve(tab.id);
})
})
}
function getCookies(url:string, name:string){
return new Promise((resolve, reject) => {
if (name == "") {
chrome.cookies.getAll({url}, (cookie) => {
resolve(cookie);
})
} else {
chrome.cookies.get({
url: url,
name: name
}, (cookies) => {
resolve(cookies);
})
}
})
}
function getCookieAll(url:string) {
return new Promise((resolve, reject) => {
chrome.cookies.getAll({
'url': url
}, (callback) => {
if (callback.length <= 0) resolve("");
let cookies = "";
for (let i = 0; i < callback.length; i++) {
cookies += callback[i].name + '=';
cookies += callback[i].value;
if (i != callback.length - 1) cookies += "; ";
}
resolve(cookies);
})
})
}
function isTm(userNick:string) {
for (const suffix of tmNameSiffix) {
if (userNick.indexOf(suffix) !== -1) return true;
}
return false;
}
export const factoryContentUrls = ["http://localhost:8082/*", "http://localhost:8083/*", "*://admin.rtxmdz.com/*", "*://*.rtxmdz.com/*"] export const factoryContentUrls = ["http://localhost:10823/*", "*://*.rtxmdz.com/*"]
export const bookingV2Urls=["https://v2.fahuoyi.com/order/list","https://v2.fahuoyi.com/order/list*"] export const bookingV2Urls=["https://myseller.taobao.com/*","https://loginmyseller.taobao.com/*"]
export const bookingAppUrls=["https://app.fahuoyi.com/order/index","https://*.fahuoyi.com/order/index"] export const homeUrl = "https://myseller.taobao.com/home.htm/QnworkbenchHome";
export const tbIssueUrl = "https://item.upload.taobao.com/sell/merge/category.htm"
export const tmIssueUrl = "https://sell.publish.tmall.com/tmall/smart/category.htm"
\ No newline at end of file
import {PlatformCode} from "./index"
let domEle = { let domEle = {
divNav:document.getElementsByClassName("nav-link") as HTMLCollection, divNav:document.getElementsByClassName("nav-link") as HTMLCollection,
inputOrderId: "#originalIds", inputOrderId: "#originalIds",
...@@ -21,145 +20,8 @@ let domEle = { ...@@ -21,145 +20,8 @@ let domEle = {
deliverResult:():any=>document.querySelector(".ant-modal-body>div.ant-table-wrapper .ant-table-tbody"), deliverResult:():any=>document.querySelector(".ant-modal-body>div.ant-table-wrapper .ant-table-tbody"),
deliverClose: ():any=>document.querySelector("div.ant-modal-footer button") , deliverClose: ():any=>document.querySelector("div.ant-modal-footer button") ,
} }
async function booking(waybillTemplateTitle: string, orderNo: string,shopId:string) { async function booking(info: any) {
let result = { return ;
status: 4,
msg: "未找到店铺",
data: [],
}
for(let navIter=0;navIter<domEle.divNav.length;navIter++){
let aNav = domEle.divNav[navIter] as HTMLLinkElement;
if(aNav.href.indexOf(shopId)>-1){
result.status=0;
result.msg="";
if(aNav.className.indexOf("active")==-1){
aNav.click();
}
break;
}
}
if (result.status > 0) {
return result;
}
result = await waitOrder();
if (result.status > 0) {
return result;
}
changeReactInputValue(document.querySelector(domEle.inputOrderId),orderNo)
simulateMouseClick(document.querySelector(domEle.btnSearch));
result = await waitOrder();
if (result.status > 0) {
return result;
}
simulateMouseClick(document.querySelector(domEle.checkBoxSelectAll));
simulateMouseClick(document.querySelector(domEle.btnPrint));
await delayDate(500);
if(document.getElementsByClassName(domEle.modalTips).length>0){
simulateMouseClick(document.querySelector(domEle.btnTipsConfirm));
}
result = await waitDialog();
if (result.status > 0) {
return result;
}
simulateMouseClick(domEle.spanWaybillTemplate());
let waybillTemplateList= domEle.divWaybillTemplateList();
for (let i = 0; i < waybillTemplateList.childNodes.length; i++) {
let divItem = waybillTemplateList.childNodes[i] as any;
if (divItem.innerText == waybillTemplateTitle) {
simulateMouseClick(divItem);
simulateMouseClick(domEle.radioGetNewWaybill());
if (domEle.inputWaybillNoOnly().checked == false) simulateMouseClick(domEle.inputWaybillNoOnly());
if(!domEle.inputWaybillNoOnly().checked ){
result.status=5;
result.msg="未选择仅获取电子面单";
return result;
}
simulateMouseClick(domEle.btnDialogPrint());
result = await waitPrintResult();
if (result.status == 0) {
let printReslut: any = {
success: 0,
count: domEle.tableResult().rows.length-1,
fail: 0,
list: []
}
let chooseIndex = 0
let rowResultList:any = []
for (let rowIter = 1; rowIter < domEle.tableResult().rows.length; rowIter++) {
let rowResult = domEle.tableResult().rows[rowIter].cells[2].innerText;
let rowResultHTML = domEle.tableResult().rows[rowIter].cells[2].innerHTML
let rowInfo = domEle.tableResult().rows[rowIter].cells[1].childNodes[0].childNodes[0].childNodes[1].textContent;
let rowObject = {
info: rowInfo,
msg: rowResult,
success: 1,
}
rowResultList.push(rowResultHTML)
if (domEle.tableResult().rows[rowIter].cells[2].innerHTML.indexOf('class="text-error"') > -1) {
printReslut.fail++;
rowObject.success = 0;
} else {
printReslut.success++;
}
printReslut.list.push(rowObject)
}
result.data = printReslut;
// console.log(result,rowResultList);
// 如果所有的订单都打印失败则,等会再发货,关闭弹窗
if(rowResultList.every((item:any)=>item.includes('class="text-error"'))){
chooseIndex = -1
}
// 等会再发货
if(chooseIndex===-1){
console.log('等会再发货');
simulateMouseClick(domEle.btnClose());
}else{
// 马上发货
console.log('马上发货');
simulateMouseClick(domEle.btnDeliver());
}
await delayDate(1000);
// console.log('xxxx',domEle.deliverResult(),domEle.deliverClose());
if(domEle.deliverResult()){
// 关闭
simulateMouseClick(domEle.deliverClose());
}
// for (let rowIter = 1; rowIter < domEle.deliverResult().rows.length; rowIter++) {
// let rowDeliverHTML = domEle.tableResult().rows[rowIter].cells[3].innerHTML
// rowDeliverList.push(rowDeliverHTML)
// }
return result;
}
break;
}
}
result.msg = "未匹配快递单模板";
result.status = 3;
return result;
} }
......
...@@ -6,418 +6,41 @@ import { message } from "antd"; ...@@ -6,418 +6,41 @@ import { message } from "antd";
import { ACTION, Print, StartPrint } from "../types"; import { ACTION, Print, StartPrint } from "../types";
import BookingV2 from "./bookingV2" import BookingV2 from "./bookingV2"
export enum PlatformCode {
"淘系及其他平台订单模板" = 0,
"拼多多订单模板" = 1,
"京东订单模板" = 2
}
type Params = {
waybillNo: string // 运单号
platform: PlatformCode,
wayCompanyId: string
} & {
orderNo: string// 订单号
wayCompanyId: string// 快递公司的Id
platform: PlatformCode,// 平台编码,淘系及其他平台订单模板的为0,拼多多订单的为1,京东订单的为2
}& {
orderNo: string// 订单号
waybillTemplateTitle: string// 快递单模板
shopId: string,// 店铺Id
}
interface Response {
data: {
action: "StartPrint",
value: Params
}
}
window.addEventListener("message", function (res: Response) {
if (res.data.action === "StartPrint") {
chrome.storage?.local.get({ list: [] }, function (storage) {
// @ts-ignore
if (storage.list.length == 0 || !storage.list[0].wayCompanyId || !storage.list[0].waybillTemplateList.some(item => item)) {
alert("请选择快递模板")
return;
}
const { wayCompanyId, waybillNo, orderNo, platform } = res.data.value
if (!waybillNo && (!wayCompanyId || !orderNo || ![0, 1, 2].includes(Number(platform)))) {
alert("参数传递错误")
return;
}
chrome.runtime.sendMessage({ action: StartPrint, value: res.data.value }, function (response) {
})
})
}
})
enum SelectOptions {
"waybillNo" = "waybillNo",
"orderOriginalId" = "orderOriginalId"
}
// fahuoyi.com
interface Message {
action: "Print",
value: Params
}
const printWayBillByOld = function (waybillNo: string, wayCompanyId: string) {
chrome.storage.local.get({ list: [], isAutoEmit: false }, function (res) {
// 选择使用旧单号打印
let oldOptionDom = document.querySelectorAll(".form-group.mr20>.radio-inline")[1] as HTMLLabelElement
let waybillNoBtn = document.querySelector(".form-group>.form-control.original-id-input-label>option[value=waybillNo]") as HTMLOptionElement
let selectDom = document.querySelector("select.form-control.original-id-input-label") as HTMLSelectElement
let inputDom = document.querySelector(".form-group>.form-control.original-id-input") as HTMLInputElement
let serachBtn = document.querySelector(".form-group>.btn.btn-primary[type=button]") as HTMLButtonElement
let printDom = document.querySelector("#elContainer>div>.form-inline.panel-border.p15.search-panel>div[class]>.form-group.mr20[style]>select.form-control") as HTMLSelectElement
let autoDom = document.querySelectorAll("#elContainer>div>.form-inline.panel-border.p15.search-panel>div.mt10>div.form-group.mr20>select.form-control")[1] as HTMLSelectElement
// 默认参数写死
let hiddenInputDom = document.querySelector("#forcePrintMergerOrderInput") as HTMLInputElement
let printId: string
// @ts-ignore
res.list.forEach(item => {
if (item.wayCompanyId === wayCompanyId) {
printId = item.printId === "仅获取电子面单号不打印面单" ? "isGenerateWaybillNoOnly" : item.printId
// printId = item.printId
}
})
// 1.选择旧单号打印
oldOptionDom.click()
// 2.选择打单模板
waybillNoBtn.selected = true
selectDom.value = SelectOptions.waybillNo
// @ts-ignore
selectDom.dispatchEvent(new Event("change", { bubbles: true }))
// 3.选择打印机
printDom.value = printId!
printDom.dispatchEvent(new Event("change", { bubbles: true }))
// 4.自动发货
autoDom.value = "true"
autoDom.dispatchEvent(new Event("change", { bubbles: true }))
// 5.自己联系快递公司
let bySelf = document.querySelectorAll("#elContainer>div>.form-inline.panel-border.p15.search-panel>div.mt10>div.form-group.mr20>select.form-control")[2] as HTMLSelectElement
bySelf.value = "OFFLINE"
bySelf.dispatchEvent(new Event("change", { bubbles: true }))
// 6.输入运单号
// selectDom.__reactEventHandlers$8wsw7c8olk.onChange({ target: { value: SelectOptions.waybillNo } })
inputDom.value = waybillNo
// 7.默认参数写死
hiddenInputDom.value = "true"
serachBtn.click()
})
}
const printWayBillByNew = function ({ orderNo, wayCompanyId, platform }: Pick<Params, "orderNo" | "wayCompanyId" | "platform">) {
// console.log(orderNo, wayCompanyId, platform)
// 根据快递公司的companyId选择相应的配置
chrome.storage.local.get({ list: [], isAutoEmit: false }, function (res) {
// console.log(res, 'res') //res:{isAutoEmit:boolean,list:[{waybillCompanyId:"",waybillTemplateList:[x,x,x]}]}
let waybillTemplate: string;
let printId: string;
// @ts-ignore
res.list.forEach(item => {
if (item.wayCompanyId === wayCompanyId) {
waybillTemplate = item.waybillTemplateList[platform]
printId = item.printId === "仅获取电子面单号不打印面单" ? "isGenerateWaybillNoOnly" : item.printId
// printId = item.printId
}
})
let newOrderBtn = document.querySelector(".form-group.mr20>.radio-inline.mr10") as HTMLLabelElement
let wayTemplateSelect = document.querySelector(".form-group.mr20>.form-control.waybill-template-select") as HTMLSelectElement
// let orderBtn = document.querySelector(".form-group>.form-control.original-id-input-label>option[value=orderOriginalId]") as HTMLOptionElement
let selectDom = document.querySelector("select.form-control.original-id-input-label") as HTMLSelectElement
let inputDom = document.querySelector(".form-group>.form-control.original-id-input") as HTMLInputElement
let searchDom = document.querySelector(".form-group>.btn.btn-primary") as HTMLButtonElement
let printDom = document.querySelector("#elContainer>div>.form-inline.panel-border.p15.search-panel>div[class]>.form-group.mr20[style]>select.form-control") as HTMLSelectElement
let autoDom = document.querySelectorAll("#elContainer>div>.form-inline.panel-border.p15.search-panel>div.mt10>div.form-group.mr20>select.form-control")[1] as HTMLSelectElement
// 默认参数写死
let hiddenInputDom = document.querySelector("#forcePrintMergerOrderInput") as HTMLInputElement
//1.点击 获取新单号打印
newOrderBtn.click()
//2.选择快递单模板
wayTemplateSelect.value = waybillTemplate! + ""
wayTemplateSelect.dispatchEvent(new Event("change", { bubbles: true }))
//3.点击订单编号
selectDom.value = SelectOptions.orderOriginalId
// @ts-ignore
selectDom.dispatchEvent(new Event("change", { bubbles: true }))
// 4. 选择打印机
printDom!.value = printId!
printDom.dispatchEvent(new Event("change", { bubbles: true }))
// orderBtn.click()
// 5.自动发货
autoDom.value = "true"
autoDom.dispatchEvent(new Event("change", { bubbles: true }))
// 6.自己联系快递公司
let bySelf = document.querySelectorAll("#elContainer>div>.form-inline.panel-border.p15.search-panel>div.mt10>div.form-group.mr20>select.form-control")[2] as HTMLSelectElement
bySelf.value = "OFFLINE"
bySelf.dispatchEvent(new Event("change", { bubbles: true }))
//7.输入订单编号
inputDom.value = orderNo
// 8.默认参数写死
hiddenInputDom.value = "true"
//9.点击搜索并打印
searchDom.click()
})
}
// web页面通信 // web页面通信
window.addEventListener("message",function(message:any){ window.addEventListener("message",function(message:any){
console.log(1111,message); console.log('web页面通信',message);
if(message.data.action == ACTION.task){ if(message.data.action == ACTION.task){
chrome.runtime.sendMessage(message.data,(ret)=>{ chrome.runtime.sendMessage(message.data,(ret)=>{
window.postMessage({isResult:1,...ret},"*") // window.postMessage({isResult:1,...ret},"*")
console.log("message ret:",ret,message.data); console.log("message ret:",ret,message.data);
}) })
} }
}) })
//发货易页面 //发货易页面
chrome.runtime.onMessage.addListener(function (message: Message, sender, response) { chrome.runtime.onMessage.addListener(function (message, sender, response) {
console.log("发货易页面",message);
if (message.action === Print) { if (message.action === ACTION.task) {
if (message.value.waybillNo) {
printWayBillByOld(message.value.waybillNo, message.value.wayCompanyId)
} else {
const { orderNo, wayCompanyId, platform } = message.value
printWayBillByNew({ orderNo, wayCompanyId, platform })
}
}
else if (message.action === ACTION.task) {
console.log("task",message);
let result=null; let result=null;
(async () => { (async () => {
result = await BookingV2.booking(message.value.waybillTemplateTitle,message.value.orderNo,message.value.shopId); result = await BookingV2.booking(message.value);
response(result); response(result);
})(); })();
} }
return true; return true;
}) })
// 拿到打印机
chrome.runtime.onConnect.addListener(function (port) {
if (port.name === "getPrinter") {
port.onMessage.addListener(function (msg) {
if (msg.action === "getPrint") {
// @ts-ignore
let options: HTMLOptionElement[] = document.querySelectorAll("#elContainer>div>.form-inline.panel-border.p15.search-panel>div[class]>.form-group.mr20[style]>select.form-control>option")
// console.log(2)
// console.log(options, options[0].value, '3')
let arr = []
for (let i = 0; i < options.length; i++) {
arr.push(options[i].textContent)
// arr.push(options[i].value)
}
port.postMessage(arr)
}
})
}
})
chrome.runtime.onConnect.addListener(function (port) {
if (port.name === "sendNewWaybillNo") {
// console.log(port, 'port')
port.onMessage.addListener(function (msg) {
// console.log(msg, 'msg')
if (msg.action === "sendNewWaybillNo") {
window.postMessage({ action: "newWaybillNo", message: msg?.message, orderNo: msg?.orderNo, waybillNo: msg?.waybillNo, result: msg.result }, '*')
port.postMessage({ action: "answer" })
}
})
}
})
// inject.js
const startPrintWayBill = function (params: Params) {
// 通知content.js触发事件
window.postMessage({ action: "StartPrint", value: params }, "*")
return new Promise(function (resolve, reject) {
// @ts-ignore
window.onmessage = function (res) {
if (res.data.action === "newWaybillNo") {
console.log(res.data, 'res.data')
res.data.result ? resolve(res.data.waybillNo) : reject(res.data);
}
}
})
};
/** /**
* 发货易content * 发货易content
*/ */
window.addEventListener("message", function (msg) { window.addEventListener("message", function (msg) {
console.log('发货易content',msg); console.log('发货易content',msg);
if (msg.data.action === "sendNewWaybillNo") {
// chrome.runtime.onConnect.addListener(function (port) {
// console.log(port, 'port')
// port.postMessage(msg.data)
// })
chrome.runtime.sendMessage(msg.data)
}
}) })
function hookConfirm(){
let temp = document.createElement("script")
temp.innerHTML = `
if(!convertMark){
_confirm = confirm;
confirm=function(msg){
console.log(msg);
return true;
}
var convertMark=true;
}
`
document.body.appendChild(temp)
}
function injectCustomjs() {
let temp = document.createElement("script")
temp.innerHTML = `window.startPrintWayBill=${startPrintWayBill}`
document.body.appendChild(temp)
let tbodyDom = document.querySelector("#elContainer>div>table>tbody")
if (tbodyDom) {
let observe = new MutationObserver(function (mutations, observe) {
console.log(mutations, 'mutations')
let td = mutations[0].addedNodes[0].childNodes[3]
console.log(td, 'td')
if (!td) return;
let tdObserve = new MutationObserver(function (mutations, observe) {
console.log(mutations, 'mutations')
mutations.forEach(item => {
item.addedNodes.forEach(node => {
// @ts-ignore
if (node.nodeType == 3 && node.parentElement?.className.includes("text-danger")) {
console.log(node.textContent, 'nodeTextContent')
// @ts-ignore
return window.postMessage({ action: "sendNewWaybillNo", message: node?.wholeText, result: false }, "*")
}
if (node.nodeName == "DIV") {
let text = node.childNodes[2].textContent;
let orderNo = item.target.parentElement?.children[0]?.children[0]?.childNodes[0]?.textContent
console.log(orderNo, 'orderNo')
window.postMessage({ action: "sendNewWaybillNo", waybillNo: text, orderNo, result: true }, "*")
// 从发货易页面发消息给bg
// chrome.runtime.sendMessage({ action: "newWaybillNo", value: text }, function (res) {
// })
// console.log("fahuoyi")
// let fahuoyiPort = chrome.runtime.connect({ name: "sendMessage" })
// fahuoyiPort.postMessage({ action: "newWaybillNo", value: text })
// chrome.runtime.onConnect.addListener(function (port) {
// console.log(port, 'port')
// port.postMessage({ action: "newWaybillNo", value: text })
// })
}
})
})
})
tdObserve.observe(td, {
childList: true,
characterData: true,
subtree: true,
attributes: true
})
})
observe.observe(tbodyDom!, {
childList: true,
})
let bfqxDom = document.querySelector("body")
let observe1 = new MutationObserver(function (mutations, observe) {
// mutations[0].addedNodes[0].className
console.log(mutations, 'bfqxDom')
mutations.forEach(item => {
item.addedNodes.forEach(node => {
// node.textContent == 'bootbox modal fade sui-modal in' &&
if (node.textContent == '× 该订单有商品正在退款中或者已取消,是否确认继续打印?确定取消') {
let bfqxyesbtn = document.querySelector(".btn.btn-primary.bootbox-accept") as HTMLButtonElement
let bfqxnobtn = document.querySelector(".btn.btn-default.bootbox-cancel") as HTMLButtonElement
console.log('bfqxyesbtn', bfqxyesbtn)
bfqxyesbtn.click()
}
})
})
})
observe1.observe(bfqxDom!, {
childList: true,
})
}
}
injectCustomjs()
import React, { useState, useCallback, useEffect } from "react"; import React, { useState, useCallback, useEffect } from "react";
import { Select, Button } from "antd"; import { Button } from "antd";
import "./index.scss"; import "./index.scss";
import {bookingV2Urls,factoryContentUrls } from "../../../config";
const { Option } = Select interface User {
export interface IwaybillTemplate { userNick: string,
name: string, cookie:string,
value: string token:string
} }
interface Item {
wayCompanyId: string | undefined,
waybillTemplateList: (string | undefined)[]
printId: string | undefined
}
type List = Item[]
const AllWayCompany = [
{ name: "圆通速递", value: "YTO" }
, { name: "申通快递", value: "STO" }
, { name: "中通快递", value: "ZTO" }
, { name: "韵达快递", value: "YUNDA" }
, { name: "顺丰速运", value: "SF" }
, { name: "百世快递", value: "HTKY" }
, { name: "EMS", value: "EMS" }
, { name: "EMS经济快递", value: "EYB" }
, { name: "邮政标准快递", value: "DISTRIBUTOR_1715055" }
, { name: "邮政快递包裹", value: "POSTB" }
, { name: "中国邮政", value: "POST" }
, { name: "京东快递", value: "EX_JD_EXPRESS" }
, { name: "天天快递", value: "TTKDEX" }
, { name: "国通快递", value: "GTO" }
, { name: "安能快递(小包)", value: "DISTRIBUTOR_12017865" }
, { name: "安能物流", value: "ANE56" }
, { name: "全峰快递", value: "QFKD" }
, { name: "联邦快递", value: "FEDEX" }
, { name: "德邦快递", value: "DBKD" }
, { name: "德邦物流", value: "DBL" }
, { name: "宅急送", value: "ZJS" }
, { name: "优速快递", value: "UC" }
, { name: "龙邦速递", value: "LB" }
, { name: "亚风", value: "AIR" }
, { name: "天地华宇", value: "HOAU" }
, { name: "速尔快运", value: "SURE" }
, { name: "大田", value: "DTW" }
, { name: "保宏物流", value: "BHWL" }
, { name: "发网", value: "UNIPS" }
, { name: "长发", value: "YUD" }
, { name: "长宇", value: "CYEXP" }
, { name: "远长", value: "YC" }
, { name: "东方汇", value: "DFH" }
, { name: "飞远配送 ", value: "GZLT" }
, { name: "派易国际物流77", value: "PKGJWL" }
, { name: "信丰物流", value: "XFWL" }
, { name: "飞远(爱彼西)配送", value: "HZABC" }
, { name: "华强物流", value: "SHQ" }
, { name: "百世物流", value: "BEST" }
, { name: "新邦物流", value: "XB" }
, { name: "美国速递", value: "MGSD" }
, { name: "远成快运", value: "YCKY" }
, { name: "品骏快递", value: "PJBEST" }
, { name: "苏宁物流", value: "DISTRIBUTOR_13452378" }
, { name: "WnDirect", value: "WND" }
, { name: "能达速递", value: "NEDA" }
, { name: "黑猫宅急便", value: "YCT" }
, { name: "D速物流", value: "DISTRIBUTOR_13460212" }
, { name: "联昊通", value: "LTS" }
, { name: "E速宝", value: "ESB" }
, { name: "佳吉快递", value: "CNEX" }
, { name: "广东EMS", value: "GDEMS" }
, { name: "增益速递", value: "QRT" }
, { name: "全一快递", value: "UAPEX" }
, { name: "快捷快递", value: "FAST" }
, { name: "中铁快运", value: "CRE" }
, { name: "速通物流", value: "EX_SUT56" }
, { name: "顺丰快运", value: "EX_SFKY" }
, { name: "速腾快递", value: "EX_STE56" }
, { name: "顺心捷达", value: "DISTRIBUTOR_13484485" }
, { name: "宽昊物流", value: "EX_KHWL" }
, { name: "都市节奏", value: "EX_DSJZ" }
, { name: "众邮快递", value: "EX_ZYKD" }
, { name: "京东快运", value: "EX_JDKY" }
, { name: "DN快递", value: "EX_TOPSPEED_DN" }
, { name: "九曳供应链", value: "DISTRIBUTOR_13323734" }
, { name: "重庆华宇物流", value: "EX_CQHY" }
, { name: "极兔速递", value: "EX_JTSD" }
, { name: "丹鸟", value: "DISTRIBUTOR_13503931" }
, { name: "如风达配送", value: "BJRFD-001" }
, { name: "韵达点通达", value: "EX_YUNDA_DTD" }
, { name: "壹米滴答", value: "YMDD" }
, { name: "百世国际", value: "DISTRIBUTOR_13433751" }
, { name: "安迅物流", value: "DISTRIBUTOR_13365751" }
, { name: "承诺达特快", value: "DISTRIBUTOR_13469985" }
, { name: "沃埃家", value: "EX_WOWVIP" }
, { name: "京广速递", value: "EX_SZKKE" }
, { name: "鸿昌物流", value: "EX_HC" }
, { name: "华企快运", value: "EX_HUAQIEX" }
, { name: "中骅物流", value: "EX_CHUNGHWA56" }
, { name: "百世快运", value: "BESTQJT" }
, { name: "运通速运", value: "WTO" }
, { name: "中通快运", value: "DISTRIBUTOR_13222803" }
, { name: "菜鸟大件-日日顺配", value: "DISTRIBUTOR_13159132" }
, { name: "安世通快递", value: "DISTRIBUTOR_13415300" }
, { name: "百世云配", value: "DISTRIBUTOR_13468073" }
, { name: "韵达快运", value: "DISTRIBUTOR_13421750" }
, { name: "中通国际直邮", value: "DISTRIBUTOR_13196453" }
, { name: "京东大件开放承运商", value: "EX_JD_HPCP" }
, { name: "加运美速递", value: "DISTRIBUTOR_13468074" }
, { name: "中运全速", value: "EX_TOPSPEED" }
, { name: "其他", value: "OTHER" }
, { name: "跨越速运", value: "DISTRIBUTOR_13211725" }
, { name: "菜鸟大件-中铁配", value: "DISTRIBUTOR_13148625" }
]
const PlatformsMap = new Map([
[0, /.+:\/\/a.*\.fahuoyi.com\//],
[1, /.+:\/\/pdd.*\.fahuoyi.com\//],
[2, /.+:\/\/jd.*\.fahuoyi.com\//]
])
const WayBillModel = function () { const WayBillModel = function () {
// 当前是否连接成功 // 当前是否连接成功
const [link,setLink] = useState<string>('') const [link,setLink] = useState<boolean>(false)
// 当前的登录状态 // 当前的登录状态
const [is_login,setIsLogin] = useState<boolean>(false) const [is_login,setIsLogin] = useState<boolean>(false)
// 用户信息 // 用户信息
const [user,setUser] = useState<object>({ const [user,setUser] = useState<User>({
name: '', userNick: '',
cookie:'',
token:''
}) })
const [list, setList] = useState<List>([])
const [AWaybillTemplate, setAWaybillTemplate] = useState<IwaybillTemplate[]>([])
const [PDDWaybillTemplate, setPDDWaybillTemplate] = useState<IwaybillTemplate[]>([])
const [JDWaybillTemplate, setJDWaybillTemplate] = useState<IwaybillTemplate[]>([])
const [printList, setPrintList] = useState<string[]>([])
const setMap = new Map([
[0, setAWaybillTemplate],
[1, setPDDWaybillTemplate],
[2, setJDWaybillTemplate]
])
const getMap = new Map([
[0, AWaybillTemplate],
[1, PDDWaybillTemplate],
[2, JDWaybillTemplate]
])
// 获取发货易快递模板列表 // 获取发货易快递模板列表
const getLogin = useCallback(async () => { const getLogin = useCallback(async () => {
chrome.tabs.query({ chrome.tabs.query({
url: "*://myseller.taobao.com/home.htm/shop-manage/shop-center" url: [...bookingV2Urls,...factoryContentUrls]
}, async function (tabs) { }, async function (tabs) {
console.log(1111,tabs); console.log('tabs',tabs);
if(!tabs||!tabs.length){
let platformUrls = tabs.filter(item=>item.url) setLink(false)
// platformUrls = tabs.filter(item=>item.url) console.log('未连接')
console.log(platformUrls, 'platformUrls') }else{
for (let index in platformUrls) { setLink(true)
let prefix = platformUrls[index] // let urls = tabs.map(item=>item.url)
console.log(prefix, 'prefix') // if(urls.includes('https://myseller.taobao.com/*')&&urls.includes('*://*.rtxmdz.com/*')){
let data = prefix ? await fetch(prefix + "waybillTemplate/listRest?_=" + new Date().getTime(), { method: "GET" }).then(res => { // setLink(true)
console.log("2") // }
return res.json()
}) : []
console.log("3")
console.log(data, 'data')
setMap.get(Number(index))!(pre => {
// @ts-ignore
return data.map(dataItem => ({
name: dataItem.name,
value: dataItem.id
}))
})
} }
}) })
}, []) }, [])
const getPrintList = useCallback(async () => {
chrome.tabs.query({
url: "*://*.fahuoyi.com/scanPrinting/index"
}, async function (tabs) {
if (tabs.length >= 1) {
let port = chrome.tabs.connect(tabs[0].id!, { name: "getPrinter" });
port.postMessage({ action: "getPrint" })
port.onMessage.addListener(function (msg) {
setPrintList(msg)
})
}
})
}, [])
useEffect(() => { useEffect(() => {
getLogin() getLogin()
// getPrintList() // 获取用户信息
chrome.storage.local.get({ list: [{ wayCompanyId: undefined, waybillTemplateList: [undefined, undefined, undefined], printId: undefined }] }, function (res) { chrome.storage.sync.get("tb_user",function(res){
if (res.list.length === 0) { console.log(res);
chrome.storage.local.set({ list: [{ wayCompanyId: undefined, waybillTemplateList: [undefined, undefined, undefined], printId: undefined }] }, function () {
setList([{ wayCompanyId: undefined, waybillTemplateList: [undefined, undefined, undefined], printId: undefined }]) let userData = res.tb_user
}) if (userData == null) {
} else { setIsLogin(false)
setList(res.list as List) setUser({userNick: '',
} cookie:'',
token:''})
}) } else {
}, []) let userDataJson:any = JSON.parse(userData)
setIsLogin(true)
useEffect(() => { setUser(userDataJson)
chrome.storage.local.set({ list: list }) setLink(true)
}, [list]) }
const onChangeWayCompany = useCallback((value: string, wayIndex: number) => {
setList(pre => {
const newList = [...pre]
newList[wayIndex].wayCompanyId = value
return newList;
})
}, [])
const onChangeWayTemplate = useCallback((e: string, wayIndex: number, tempIndex: number) => {
setList(pre => {
const newList = [...pre]
newList[wayIndex].waybillTemplateList[tempIndex] = e;
return newList
})
}, [])
const onChangePrint = useCallback((e: string, wayIndex: number) => {
setList(pre => {
const newList = [...pre]
newList[wayIndex].printId = e;
return newList;
}) })
}, []) }, [])
// 刷新连接状态 // 刷新连接状态
const refresh = useCallback(() => { const refresh = useCallback(() => {
setList(pre => { getLogin()
const newState = [...pre] chrome.runtime.sendMessage({ action: 'getUserLoginData' },async()=>{
newState.push({ wayCompanyId: undefined, waybillTemplateList: [undefined, undefined, undefined], printId: undefined }) let userData:any = await getStorageItem("tb_user")
return newState; console.log('userData',userData,new Date().getMinutes(),new Date().getSeconds());
if (userData == null) {
setIsLogin(false)
setUser({userNick: '',
cookie:'',
token:''})
} else {
let userDataJson:any = JSON.parse(userData)
setIsLogin(true)
setUser(userDataJson)
setLink(true)
}
}) })
// alert("刷新完毕");
}, []) }, [])
// 删除
// const remove = useCallback((index: number) => {
// setList(pre => {
// const newState = [...pre]
// newState.splice(index, 1)
// return newState
// })
// }, [])
return ( return (
<> <>
<div className="waybill-model"> <div className="waybill-model">
<div className="waybill-model-title" key="one">千牛登录账号:{is_login?user:'未登录'}</div> <div className="waybill-model-title" key="one">千牛登录账号:{is_login?user.userNick:'未登录'}</div>
<div className="waybill-model-title" key="two">通信状态:{link?'连接成功':'连接中断'}</div> <div className="waybill-model-title" key="two">通信状态:{link?'连接成功':'连接中断'}</div>
</div> </div>
<Button type="link" onClick={ refresh }>刷新连接状态</Button> <Button type="link" onClick={ refresh }>刷新连接状态</Button>
</> </>
) )
} }
function getStorageItem(key:string) {
return new Promise((resolve, reject) => {
chrome.storage.sync.get([key], (item) => {
resolve(item[key]);
})
})
}
export default WayBillModel export default WayBillModel
\ No newline at end of file
...@@ -3,8 +3,8 @@ ...@@ -3,8 +3,8 @@
flex-direction: column; flex-direction: column;
justify-content: flex-start; justify-content: flex-start;
align-items: stretch; align-items: stretch;
height:400px; height:200px;
width: 400px; width: 300px;
.popup-page-title{ .popup-page-title{
padding:10px 0; padding:10px 0;
font-size: 16px; font-size: 16px;
......
...@@ -7,7 +7,7 @@ import "./popup.scss" ...@@ -7,7 +7,7 @@ import "./popup.scss"
const Popup = function () { const Popup = function () {
return ( return (
<div className="popup-page"> <div className="popup-page">
<span className="popup-page-title">打单设置</span> <span className="popup-page-title">设置</span>
<div className="waybill-panel"> <div className="waybill-panel">
<span className="waybill-panel-title">插件状态</span> <span className="waybill-panel-title">插件状态</span>
<div className="waybill-model-wrap"> <div className="waybill-model-wrap">
......
// ScanPrintingForm对象默认绑定在 window["scan-printing-form"]
// 可以在发货易js加载之前增加事件回调,可以保证获取到ScanPrintingForm对象
// window.addEventListener("onSEScanPrintingFormLoad", () => {
// const scanPrintingForm = window["scan-printing-form"];
// });
/**
* 扫描打印数据加载完成回调函数
*/
type OnLoadCallbackFunction = (data: OnLoadData) => void;
/**
* 扫描打印数据加载完成回调数据
*/
interface OnLoadData {
waybillTemplates: WaybillTemplate[];
shippingAddresses: ShippingAddress[];
printers: Printer[];
}
interface ScanPrintingForm {
/**
* 增加数据加载成功回调方法
* 使用示例
* ```
* scanPrintingForm.onLoad((data)=>{
* const { waybillTemplates, shippingAddresses, printers } = data;
*
* })
* ```
*/
onLoad(callbackFn: OnLoadCallbackFunction): void;
/**
* 配置表单
*/
config(params: ConfigParams): Result;
/**
* 发送扫描打印任务
*/
searchAndPrint(value: string): Result;
}
interface Result {
successful: boolean;
message: string;
}
/**
* 扫描打印类型
*/
enum ScanPrintSearchType {
/**
* 使用订单编号
*/
ORDER_ORIGINAL_ID = "ORDER_ORIGINAL_ID",
/**
* 使用运单号
*/
WAYBILL_NO = "WAYBILL_NO",
}
/**
* 获取运单号方式
*/
enum GetWaybillNoMethod {
/**
* 使用新单号
*/
NEW = "NEW",
/**
* 使用旧单号
*/
OLD = "OLD",
}
/**
* 发货方式
*/
enum ShippingWay {
/**
* 自己联系物流
*/
OFFLINE = "OFFLINE",
/**
* 在线下单
*/
ONLINE = "ONLINE",
}
/**
* 快递单模板打印类型
*/
interface ConfigParams {
/**
* 扫描类型
*/
searchType: ScanPrintSearchType;
/**
* 是否避免重复扫描打印
*/
checkRepeatPrint: boolean;
/**
* 快递单模板id
*/
waybillTemplateId: number;
/**
* 打印机名称
*/
printer: string;
/**
* 发货人id
*/
shippingAddressId: number;
/**
* 是否打印成功后自动发货
*/
autoShippingAfterPrint: boolean;
/**
* 获取面单方式
*/
getWaybillNoMethod: GetWaybillNoMethod;
/**
* 发货方式
*/
shippingWay?: ShippingWay;
}
/**
* 快递单模板的类型
*/
enum WaybillTemplateType {
CAINIAO = "CAINIAO",
JD = "JD",
JDL = "JDL",
NORMAL = "NORMAL",
OFFICIAL = "OFFICIAL",
PDD = "PDD",
JINRITEMAI = "JINRITEMAI",
TAOBAO_CAINIAO = "TAOBAO_CAINIAO",
}
/**
* 快递单模板
*/
interface WaybillTemplate {
allowedShopIds?: string;
allowedShopIdsArray?: string[];
bindingPrinter: string;
bindingShopIds: string;
companyId: number;
customAreaHeight?: number;
customAreaLeft: number;
customAreaPrintTemplateUrl: string;
customAreaTop: number;
customAreaWidth?: number;
defaultShippingAddressId: number;
deleted: boolean;
enableEmptyShortAddressCheck: boolean;
/**
* 只有电子面单才有此字段
* 申请地址id
*/
ewaybillShippingAddressId: number;
forceNoPageMargins: boolean;
height: number;
id: number;
index: number;
is3PartsWaybill: boolean;
isPrintBottomLogo: boolean;
isPrintTopLogo: boolean;
isSystemTemplate: boolean;
logisticsCompany: LogisticsCompany;
name: string;
offsetLeft: number;
offsetTop: number;
picture: string;
printTemplateId: string;
printTemplateUrl: string;
printType: WaybillTemplatePrintType;
serviceOptions: string;
shopId: number;
supportsChildWaybillNoMode: boolean;
systemTemplateId: number;
thumbnail: string;
type: WaybillTemplateType;
width: number;
}
/**
* 快递单模板打印类型
*/
enum WaybillTemplatePrintType {
CAINIAO = "CAINIAO",
JDL = "JDL",
PDD = "PDD",
/**蓝牙打印 */
PRINT_CMD = "PRINT_CMD",
JINRITEMAI = "JINRITEMAI",
}
/**
* 快递公司类型
*/
enum LogisticsCompany {
/**中通快递 */
ZTO = "ZTO",
/**中通快运 */
ZTO56 = "ZTO56",
/**圆通速递 */
YTO = "YTO",
/**申通快递 */
STO = "STO",
/**韵达速递 */
YUNDA = "YUNDA",
/**韵达快运 */
YUNDA56 = "YUNDA56",
/**中国邮政 */
POST = "POST",
/**邮政快递包裹 */
POSTB = "POSTB",
/**邮政标准快递 */
POSTS = "POSTS",
/**EMS */
EMS = "EMS",
/**顺丰速运 */
SF = "SF",
/**顺丰快运 */
SFKY = "SFKY",
/**极兔速递 */
JT = "JT",
/**天天快递 */
TTKDEX = "TTKDEX",
/**宅急送 */
ZJS = "ZJS",
/**百世快递 */
HTKY = "HTKY",
/**百世快运 */
BESTQJT = "BESTQJT",
/**百世物流 */
BEST = "BEST",
/**众邮快递 */
ZY = "ZY",
/**京东快运 */
JDKY = "JDKY",
/**丰网速运 */
FENGWANG = "FENGWANG",
/**安能快递 */
ANE66 = "ANE66",
/**安能物流 */
ANE56 = "ANE56",
/**京东快递 */
JD_EXPRESS = "JD_EXPRESS",
/**京东大件物流 */
JD_HPCP = "JD_HPCP",
/**德邦物流 */
DBL = "DBL",
/**德邦快递 */
DBKD = "DBKD",
/**韵达国际 */
YUNDAGJ = "YUNDAGJ",
/**韵达同城 */
YUNDA_TC = "YUNDA_TC",
/**申通快运 */
STO56 = "STO56",
/**申通国际 */
STOGJ = "STOGJ",
/**中通国际 */
ZTOGJ = "ZTOGJ",
/**国通快递 */
GTO = "GTO",
/**EMS经济快递 */
EYB = "EYB",
/**跨越速运 */
KUAYUE = "KUAYUE",
/**安鲜达 */
EXFRESH = "EXFRESH",
/**九曳供应链 */
JIUYESCM = "JIUYESCM",
/**优速快递 */
UC = "UC",
/**万象物流 */
WXWL = "WXWL",
/**全锋快递 */
QFKD = "QFKD",
/**龙邦快递 */
LB = "LB",
/**全一快递 */
UAPEX = "UAPEX",
/**快捷快递 */
FAST = "FAST",
/**天地华宇 */
HOAU = "HOAU",
/**品骏快递 */
PJBEST = "PJBEST",
/**如风达快递 */
RFD = "RFD",
/**远成快运 */
YCKY = "YCKY",
/**壹米滴答 */
YMDD = "YMDD",
/**速尔快递 */
SURE = "SURE",
/**速通物流 */
SUT56 = "SUT56",
/**中铁快运 */
CRE = "CRE",
/**亚风 */
AIR = "AIR",
/**佳吉快递 */
CNEX = "CNEX",
/**联邦快递 */
FEDEX = "FEDEX",
/**增益速递 */
QRT = "QRT",
/**加运美速递 */
JYMWL = "JYMWL",
/**信丰物流 */
XFWL = "XFWL",
/**大田物流 */
DTW = "DTW",
/**D速物流 */
DSWL = "DSWL",
/**承诺达特快 */
CNDTK = "CNDTK",
/**运通物流 */
YTWL = "YTWL",
/**长宇物流 */
CYWL = "CYWL",
/**新邦物流 */
XBWL = "XBWL",
/**联昊通 */
LWT = "LWT",
/**苏宁物流 */
SNWL = "SNWL",
/**能达速递 */
NDSD = "NDSD",
/**保宏物流 */
BHWL = "BHWL",
/**发网 */
FW = "FW",
/**长发 */
CF = "CF",
/**远长 */
YC = "YC",
/**东方汇 */
DFH = "DFH",
/**飞远配送 */
FYPS = "FYPS",
/**黑猫宅急便 */
HMZJB = "HMZJB",
/**E速宝 */
ESB = "ESB",
/**华强物流 */
HQWL = "HQWL",
/**安迅物流 */
AXWL = "AXWL",
/**中运全速 */
TOPSPEED = "TOPSPEED",
/**华企快运 */
HUAQIEX = "HUAQIEX",
/**丹鸟 */
DN = "DN",
/**都市节奏 */
DSJZ = "DSJZ",
/**宽昊物流 */
KHWL = "KHWL",
/**顺心捷达 */
SXJD = "SXJD",
/**京广速递 */
SZKKE = "SZKKE",
/**韵达点通达 */
YUNDA_DTD = "YUNDA_DTD",
/**百世云配 */
BSYP = "BSYP",
/**运通速运 */
WTO = "WTO",
/**沃埃家 */
WOWVIP = "WOWVIP",
/**菜鸟裹裹 */
CN_GUOGUO = "CN_GUOGUO",
/**淘特物流快递 */
TTWLKD = "TTWLKD",
/**速腾快递 */
STE56 = "STE56",
/**安得物流 */
ANDE = "ANDE",
/**百世国际 */
BESTGJ = "BESTGJ",
/**当当网 */
DANGDANG = "DANGDANG",
/**EWE全球快递 */
EWE = "EWE",
/**丰云配 */
FYP = "FYP",
/**高捷物流 */
GJWL = "GJWL",
/**空港宏远电商物流 */
HYWL = "HYWL",
/**卡行天下快运 */
KXTX = "KXTX",
/**日日顺 */
RRS = "RRS",
/**威盛快递 */
WSKD = "WSKD",
/**威时沛运 */
WSPY = "WSPY",
/**贝海国际速递 */
XLOBO = "XLOBO",
/**中远e环球 */
ZYEHQ = "ZYEHQ",
/**转运四方物流 */
ZYSF = "ZYSF",
/**卓志速运 */
ZZSY = "ZZSY",
/**其他 */
OTHER = "OTHER",
}
/**
* 发货人对象
*/
interface ShippingAddress {
id: number;
/**绑定的店铺列表 用,分割 */
bindingShopIds: string;
city: string;
cityCode: number;
district: string;
districtCode: number;
mobile: string;
/**发货地址名称 */
name: string;
province: string;
provinceCode: number;
/**发货人姓名 */
shipperName: string;
street: string;
telephone: string;
zipCode: string;
/**排序 */
index: number;
}
/**
* 打印机对象
*/
interface Printer {
name: string;
}
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