You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
pdd-order-api/app/libs/tool/class.PrintTplTool.php

1338 lines
55 KiB
PHP

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<?php
class PrintTplTool {
private static $tradeSeqMap = [];
private static $sortingCodeList = [];
public static function resetTradeSeqMapAndSortingCodeList($sortingCodeList) {
self::$tradeSeqMap = [];
self::$sortingCodeList = $sortingCodeList ?: [];
}
public static function rebuildNodeItemInfo($node) {
if (!in_array($node['type'], ['itemInfo', 'qrcode'])) {
return $node;
}
if ($node['type'] == 'qrcode' && $node['fieldType'] != 'itemInfo') {
return $node;
}
$skuSpecFields = ['itemSkuWeight', 'itemOrdSkuName', 'skuSubName', 'itemSubName', 'outerSkuId', 'itemOuterSkuId', 'itemPrice', 'itemCouponPrice'];
$allSkuFields = ['itemSkuWeight', 'itemOrdSkuName', 'skuSubName', 'itemSubName', 'outerSkuId', 'itemOuterSkuId', 'itemPrice', 'itemCouponPrice', 'itemQty', 'itemTotalPrice'];
$hasSkuField = false;
foreach ($node['fields'] as $k => $field) {
if (in_array($field['name'], $skuSpecFields)) {
$hasSkuField = true;
break;
}
}
if ($hasSkuField) {
$wareFields = [];
$skuFields = [];
$preFieldType = 'ware';
foreach ($node['fields'] as $k => $field) {
if ($field['name'] == 'lineBreak' && count($node['fields']) == ($k + 1)) {
$skuFields[] = $field;
break;
}
if (in_array($field['name'], ['customContent', 'lineBreak'])) {
$preField = $node['fields'][$k - 1];
$nextField = $node['fields'][$k + 1];
if ($preFieldType == 'sku' && $nextField && (in_array($nextField['name'], $allSkuFields) || in_array($nextField['name'], ['customContent', 'lineBreak']))) {
$skuFields[] = $field;
$preFieldType = 'sku';
} else {
$wareFields[] = $field;
$preFieldType = 'ware';
}
} elseif (in_array($field['name'], $allSkuFields)) {
$skuFields[] = $field;
$preFieldType = 'sku';
} else {
$wareFields[] = $field;
$preFieldType = 'ware';
}
}
} else {
$wareFields = $node['fields'];
$skuFields = [];
}
$node['wareFields'] = $wareFields;
$node['skuFields'] = $skuFields;
return $node;
}
public static function buildItemTagNodesPrintText(&$node, $trade, $item, $opSetting, $printType) {
if ($node['type'] == 'normal') {
$values = self::getFieldsValue($node['fields'], [], $trade, [], $item, 0, [], $opSetting, $printType);
$node['printText'] = implode('', $values);
}
if ($node['type'] == 'barcode') {
$values = self::getFieldsValue([['name' => $node['name']]], [], $trade, [], $item, 0, $opSetting, [], $printType);
$node['value'] = implode('', $values);
}
}
public static function buildNodePrintText(&$node, $trade, $senderAddress, $wlbInfo, $packageId, $opSetting, $expressTpl, $printFrom, $printType) {
DebugData::add('buildNodePrintText', [
'node' => $node,
'trade' => $trade,
'senderAddress' => $senderAddress,
'wlbInfo' => $wlbInfo,
'packageId' => $packageId,
'opSetting' => $opSetting,
'expressTpl' => $expressTpl,
'printFrom' => $printFrom,
'printType' => $printType,
]);
$packageId = $packageId ?: '';
if ($node['type'] == 'itemInfo') {
self::buildItemInfoPrintText($node, $trade, $senderAddress, $wlbInfo, $packageId, $opSetting, $expressTpl, $printFrom, $printType);
}
if ($node['type'] == 'normal') {
$values = self::getFieldsValue($node['fields'], $senderAddress, $trade, $wlbInfo, [], $packageId, $opSetting, $expressTpl, $printType);
$node['printText'] = implode('', $values);
}
if ($node['type'] == 'barcode') {
$values = self::getFieldsValue([['name' => $node['name']]], $senderAddress, $trade, $wlbInfo, [], $packageId, $opSetting, $expressTpl, $printType);
$node['value'] = implode('', $values);
}
if ($node['type'] == 'qrcode' && $node['fields']) {
$fieldType = $node['fieldType'] ?: 'normal';
if ($fieldType == 'itemInfo') {
self::buildItemInfoPrintText($node, $trade, $senderAddress, $wlbInfo, $packageId, $opSetting, $expressTpl, $printFrom, $printType);
} else {
$values = self::getFieldsValue($node['fields'], $senderAddress, $trade, $wlbInfo, [], $packageId, $opSetting, $expressTpl, $printType);
$node['printText'] = implode('', $values);
}
}
}
public static function buildItemInfoPrintText(&$node, $trade, $senderAddress, $wlbInfo, $packageId, $opSetting, $expressTpl, $printFrom, $printType) {
$fields = $node['fields'] ?: [];
$values = [];
$beforeValues = self::getFieldsValue($node['beforeFields'], $senderAddress, $trade, $wlbInfo, [], $packageId, $opSetting, $expressTpl, $printType);
$values[] = implode("", $beforeValues);
$items = [];
$isFreePrint = in_array($printFrom, ['freePrintSingle', 'freePrint']);
$itemSkipPrintKeywords = $opSetting['itemSkipPrintKeywords'];
$itemSkipPrintKeywords = CommonTool::splitWithComma($itemSkipPrintKeywords);
$itemFilterPrintKeywords = $opSetting['itemFilterPrintKeywords'];
$itemFilterPrintKeywords = CommonTool::splitWithComma($itemFilterPrintKeywords);
DebugData::add('itemSkipPrintKeywords', $itemSkipPrintKeywords);
DebugData::add('itemFilterPrintKeywords', $itemFilterPrintKeywords);
foreach ($trade['orders'] as $i => $order) {
foreach ($order['items'] as $j => $item) {
DebugData::add('item', $item);
if (!CommonTool::isTrue($item['isCanPrint'])) {
continue;
}
foreach ($itemSkipPrintKeywords as $itemSkipPrintKeyword) {
$itemSkipPrintKeyword = self::filterKeywordSpecialChar($itemSkipPrintKeyword);
$shortTitle = self::filterKeywordSpecialChar($item['skuShortTitle'] ?: $item['wareShortTitle']);
if (
($shortTitle && strpos($shortTitle, $itemSkipPrintKeyword) !== false) ||
($item['skuName'] && strpos(self::filterKeywordSpecialChar($item['skuName']), $itemSkipPrintKeyword) !== false) ||
($item['title'] && strpos(self::filterKeywordSpecialChar($item['title']), $itemSkipPrintKeyword) !== false)
) {
DebugData::add('itemSkipPrintKeyword', $itemSkipPrintKeyword);
continue 2;
}
}
if (!$opSetting['isPrintFreeProduct'] && $item['givenProductType'] == 'FREE') {
continue;
}
if ($isFreePrint) {
$items[($i . '_' . $j)] = $item;
continue;
}
$item['itemPrintTotal'] = $item['itemPrintTotal'] ?: $item['itemTotal'];
$item = self::filterItemKeywords($item, $itemFilterPrintKeywords);
if ($opSetting['printMergeSameWare']) {
$itemTitle = $item['shortTitle'] ?: $item['title'];
$wareId = $item['wareId'];
$wareIdAndTitleText = $wareId . $itemTitle;
DebugData::add('wareIdAndTitleText', $wareIdAndTitleText);
if (empty($items[$wareIdAndTitleText])) {
$items[$wareIdAndTitleText] = [
'title' => $item['name'],
'name' => $item['name'],
'shortTitle' => $item['shortTitle'],
'wareShortTitle' => $item['wareShortTitle'],
'skuShortTitle' => $item['skuShortTitle'],
'skuName' => $item['skuName'],
'skuSubName' => $item['skuSubName'],
'itemNum' => $item['itemNum'],
'itemPrintTotal' => $item['itemPrintTotal'],
'itemTotal' => $item['itemTotal'],
'totalPrice' => $item['totalPrice'],
'warehouse' => $item['warehouse'],
'shelves' => $item['shelves'],
'skus' => []
];
} else {
$items[$wareIdAndTitleText]['itemPrintTotal'] += $item['itemPrintTotal'];
$items[$wareIdAndTitleText]['itemTotal'] += $item['itemTotal'];
$items[$wareIdAndTitleText]['totalPrice'] += $item['totalPrice'];
}
if (empty($items[$wareIdAndTitleText]['skus'][$item['skuId']])) {
$items[$wareIdAndTitleText]['skus'][$item['skuId']] = $item;
} else {
$items[$wareIdAndTitleText]['skus'][$item['skuId']]['itemPrintTotal'] += $item['itemPrintTotal'];
$items[$wareIdAndTitleText]['skus'][$item['skuId']]['itemTotal'] += $item['itemTotal'];
$items[$wareIdAndTitleText]['skus'][$item['skuId']]['totalPrice'] += $item['totalPrice'];
}
} else {
if (empty($item['skuId'])) {
$item['skuId'] = $order['orderId'] . '_' . $item['itemId'];
}
if (empty($items[$item['skuId']])) {
$items[$item['skuId']] = $item;
} else {
$items[$item['skuId']]['itemPrintTotal'] += $item['itemPrintTotal'];
$items[$item['skuId']]['itemTotal'] += $item['itemTotal'];
$items[$item['skuId']]['totalPrice'] += $item['totalPrice'];
}
}
}
}
DebugData::add('items', $items);
if (!$isFreePrint && $opSetting['printMergeSameWare']) {
$wareFields = $node['wareFields'] ?: [];
$skuFields = $node['skuFields'] ?: [];
$rows = [];
foreach ($items as $i => $item) {
$row = [];
foreach ($wareFields as $j => $field) {
$row[] = self::getItemInfoFieldValue($field, $item);
}
$skuCount = $item['skus'] ? count($item['skus']) : 0;
$k = 0;
foreach ($item['skus'] as $skuId => $sku) {
$k++;
foreach ($skuFields as $l => $field) {
if (($field['name'] == 'lineBreak') && (count($skuFields) == ($l + 1)) && ($skuCount != $k)) {
$row[] = ' ';
continue;
}
$row[] = self::getItemInfoFieldValue($field, $sku);
}
}
$values[] = implode("", $row);
}
} else {
foreach ($items as $i => $item) {
$row = [];
foreach ($fields as $k => $field) {
$row[] = self::getItemInfoFieldValue($field, $item);
}
$values[] = implode("", $row);
}
}
$afterValues = self::getFieldsValue($node['afterFields'], $senderAddress, $trade, $wlbInfo, [], $packageId, $opSetting, $expressTpl, $printType);
$values[] = implode("", $afterValues);
$node['printText'] = implode("", $values);
}
public static function getTradePrintItems($trade, $opSetting) {
$itemSkipPrintKeywords = $opSetting['itemSkipPrintKeywords'];
$itemSkipPrintKeywords = CommonTool::splitWithComma($itemSkipPrintKeywords);
$itemFilterPrintKeywords = $opSetting['itemFilterPrintKeywords'];
$itemFilterPrintKeywords = CommonTool::splitWithComma($itemFilterPrintKeywords);
DebugData::add('itemSkipPrintKeywords', $itemSkipPrintKeywords);
DebugData::add('itemFilterPrintKeywords', $itemFilterPrintKeywords);
$items = [];
foreach ($trade['orders'] as $i => $order) {
foreach ($order['items'] as $j => $item) {
DebugData::add('item', $item);
if (!CommonTool::isTrue($item['isCanPrint'])) {
continue;
}
foreach ($itemSkipPrintKeywords as $itemSkipPrintKeyword) {
$itemSkipPrintKeyword = self::filterKeywordSpecialChar($itemSkipPrintKeyword);
$shortTitle = self::filterKeywordSpecialChar($item['skuShortTitle'] ?: $item['wareShortTitle']);
if (
($shortTitle && strpos($shortTitle, $itemSkipPrintKeyword) !== false) ||
($item['skuName'] && strpos(self::filterKeywordSpecialChar($item['skuName']), $itemSkipPrintKeyword) !== false) ||
($item['title'] && strpos(self::filterKeywordSpecialChar($item['title']), $itemSkipPrintKeyword) !== false)
) {
DebugData::add('$itemSkipPrintKeyword', $itemSkipPrintKeyword);
continue 2;
}
}
if (!$opSetting['isPrintFreeProduct'] && $item['givenProductType'] == 'FREE') {
continue;
}
$itemPrintTotal = $item['itemPrintTotal'] ? $item['itemPrintTotal'] : $item['itemTotal'];
$item['totalPrice'] = $item['jdPrice'] * $itemPrintTotal - (($item['couponPrice'] / $item['itemTotal']) * $itemPrintTotal);
$item = self::filterItemKeywords($item, $itemFilterPrintKeywords);
$items[] = $item;
}
}
return $items;
}
public static function filterItemKeywords($item, $itemFilterPrintKeywords) {
if ($item && $itemFilterPrintKeywords) {
foreach (self::getItemNeedFilterFields() as $field) {
if ($item[$field]) {
$item[$field] = str_replace($itemFilterPrintKeywords, '', $item[$field]);
}
}
}
return $item;
}
public static function resetItemInfoByFilteredValue($item) {
foreach (self::getItemNeedFilterFields() as $field) {
$fieldFiltered = $field . 'Filtered';
if (!empty($item[$fieldFiltered])) {
$item[$field] = $item[$fieldFiltered];
}
}
return $item;
}
public static function getItemNeedFilterFields() {
return ['title', 'skuName', 'shortTitle', 'itemOrdSkuName', 'skuSubName', 'skuShortTitle', 'wareShortTitle', 'itemNum'];
}
public static function filterKeywordSpecialChar($str) {
$str = $str ?: '';
return str_replace(' ', '', $str);
}
public static function buildItemTablePrintText($trade, $node, $opSetting) {
$items = self::getTradePrintItems($trade, $opSetting);
$rowsColumnsPrintText = [];
foreach ($items as $j => $item) {
$columnsPrintText = [];
foreach ($node['columns'] as $k => $column) {
$fields = $column['fields'] ?: [];
$values = [];
foreach ($fields as $i => $field) {
if ($field['name'] == 'itemIndex') {
$values[] = ($j + 1);
continue;
}
$values[] = self::getItemTableFieldValue($field, $item, $node, $column);
}
$columnsPrintText[] = implode("", $values);
}
$rowsColumnsPrintText[] = $columnsPrintText;
}
$node['rowsColumnsPrintText'] = $rowsColumnsPrintText;
return $node;
}
public static function getItemTableFieldValue($field, $item, $node, $column) {
$item = self::resetItemInfoByFilteredValue($item);
$value = '';
switch ($field['name']) {
case 'customContent':
$value = $field['text'];
break;
case 'lineBreak':
$value = '<br>';
break;
case 'itemImg':
$styleHeight = 'auto';
$styleWidth = $column['width'];
$value = '<img src="' . $item['logo'] . '" style="width:' . $styleWidth . ';height:' . $styleHeight . ';border:0;" />';
break;
case 'itemTitle':
if ($item['skuShortTitle'] || $item['wareShortTitle']) {
return $item['skuShortTitle'] ?: $item['wareShortTitle'];
} elseif ($item['title']) {
$value = $item['title'];
} elseif ($item['skuName']) {
$skuSubName = $item['skuSubName'] ?: '';
$value = str_replace($skuSubName, '', $item['skuName']);
}
break;
case 'itemOrdSkuName':
$value = $item['skuName'] ?: '';
break;
case 'skuSubName':
case 'itemSubName':
$value = $item['skuSubName'] ?: '';
break;
case 'outerSkuId':
case 'itemOuterSkuId':
$value = $item['outerSkuId'] ?: ($item['cargoNumber'] ?: '');
break;
case 'itemNum':
case 'itemNumBarcode':
$value = $item['itemNum'] ?: '';
break;
case 'itemQty':
$value = $item['itemPrintTotal'] ?: $item['itemTotal'];
break;
case 'itemPrice':
$value = $item['jdPrice'] ?: $item['price'] ?: '';
break;
case 'itemCouponPrice':
$value = $item['itemDiscountFee'] ?: $item['couponPrice'];
break;
case 'itemTotalPrice':
$value = $item['totalPrice'] ?: '0';
break;
case 'itemSkuId':
$value = $item['skuId'] ?: 0;
break;
case 'warehouse':
$value = $item['warehouse'] ?: '';
break;
case 'shelves':
$value = $item['shelves'] ?: '';
break;
}
return $value;
}
public static function getItemInfoFieldValue($field, $item) {
$item = self::resetItemInfoByFilteredValue($item);
$value = '';
switch ($field['name']) {
case 'customContent':
$value = $field['text'];
break;
case 'lineBreak':
$value = "\r\n";
break;
case 'itemSkuWeight':
if ($item['shortWeight']) {
$value = $item['shortWeight'];
} else if ($item['weight']) {
$value = $item['weight'];
}
break;
case 'itemTitle':
if ($item['skuShortTitle'] || $item['wareShortTitle']) {
return $item['skuShortTitle'] ?: $item['wareShortTitle'];
} elseif ($item['title']) {
$value = $item['title'];
} elseif ($item['skuName']) {
$skuSubName = $item['skuSubName'] ?: '';
$value = str_replace($skuSubName, '', $item['skuName']);
}
break;
case 'itemOrdSkuName':
$value = $item['skuName'] ?: '';
break;
case 'skuSubName':
case 'itemSubName':
$value = $item['skuSubName'] ?: '';
break;
case 'outerSkuId':
case 'itemOuterSkuId':
$value = $item['outerSkuId'] ?: ($item['cargoNumber'] ?: '');
break;
case 'itemNum':
case 'itemNumBarcode':
$value = $item['itemNum'] ?: '';
break;
case 'itemQty':
$value = $item['itemPrintTotal'] ?: $item['itemTotal'];
break;
case 'itemPrice':
$value = $item['jdPrice'] ?: $item['price'] ?: '';
break;
case 'itemCouponPrice':
$value = $item['couponPrice'] ?: '';
break;
case 'itemTotalPrice':
$value = $item['totalPrice'] ?: '';
break;
case 'itemNumIfNotShortTitle':
if ($item['skuShortTitle'] || $item['wareShortTitle']) {
return $item['skuShortTitle'] ?: $item['wareShortTitle'];
}
return $item['itemNum'] ?: '';
case 'wareShortTitle':
$value = $item['wareShortTitle'] ?: '';
break;
case 'skuShortTitle':
$value = $item['skuShortTitle'] ?: '';
break;
case 'warehouse':
$value = $item['warehouse'] ?: '';
break;
case 'shelves':
$value = $item['shelves'] ?: '';
break;
}
return $value;
}
public static function getItemTagSortingCodeByTradeItemTotal($tradeItemTotal) {
if (empty(self::$sortingCodeList)) {
return '';
}
$sortingCode = '';
foreach (self::$sortingCodeList as $sortingCodeData) {
if ($sortingCode != '') {
break;
}
// 匹配分拣码
switch ($sortingCodeData['symbol']) {
case '=':
if ($sortingCodeData['itemTotal'] == $tradeItemTotal) {
$sortingCode = $sortingCodeData['sortingCode'];
}
break;
case '>=':
if ($sortingCodeData['itemTotal'] <= $tradeItemTotal) {
$sortingCode = $sortingCodeData['sortingCode'];
}
break;
case '<=':
if ($sortingCodeData['itemTotal'] >= $tradeItemTotal) {
$sortingCode = $sortingCodeData['sortingCode'];
}
break;
}
}
return $sortingCode;
}
public static function getFieldsValue($fields, $sAdd, $trade, $wlbInfo, $item, $packageId, $opSetting, $expressTpl, $printType) {
$packageId = $packageId ?: '';
$values = [];
$realConsigneeInfo = !empty($trade['customAddress']) ? $trade['customAddress'] : $trade['consignee'];
foreach ($fields as $i => $field) {
switch ($field['name']) {
case 'customContent':
$values[] = $field['text'];
break;
case 'lineBreak':
$values[] = "\n";
break;
case 'sName':
$sName = $trade['senderAddress'] ?
($trade['senderAddress']['fullname'] ?: $trade['senderAddress']['sendGoodsContactor']) :
($sAdd['fullname'] ?: $sAdd['sendGoodsContactor']);
if ($opSetting['printEncryptSenderInfo']) {
$values[] = self::encryptFullname($sName);
} else {
$values[] = $sName;
}
break;
case 'sPhone':
$sPhone = $trade['senderAddress'] ? $trade['senderAddress']['mobile'] : $sAdd['mobile'];
if ($opSetting['printEncryptSenderInfo']) {
$values[] = self::encryptTelephone($sPhone);
} else {
$values[] = $sPhone;
}
break;
case 'sTel':
$sTel = $trade['senderAddress'] ? $trade['senderAddress']['telephone'] : $sAdd['telephone'];
if ($opSetting['printEncryptSenderInfo']) {
$values[] = self::encryptTelephone($sTel);
} else {
$values[] = $sTel;
}
break;
case 'sortingCode':
if ($printType == 'itemTag' && $trade['sortingCodeItemTotal'] > 0) {
$sortingCode = self::getItemTagSortingCodeByTradeItemTotal($trade['sortingCodeItemTotal']);
if ($sortingCode == '') {
$values[] = '';
break;
}
$tradeSeq = empty(self::$tradeSeqMap[$sortingCode]) ? 0 : self::$tradeSeqMap[$sortingCode];
if ($item['itemIndex'] == 1) {
$tradeSeq++;
self::$tradeSeqMap[$sortingCode] = $tradeSeq;
}
$values[] = $sortingCode.$tradeSeq.'-'.$item['itemIndex'];
break;
}
$values[] = '';
break;
case 'printDt':
$values[] = date('Y-m-d');
break;
case 'printTime':
$values[] = date('Y-m-d H:i:s');
break;
case 'sAddress':
$sAddress = $trade['senderAddress'] ? $trade['senderAddress']['fullAddress'] : $sAdd['fullAddress'];
if ($opSetting['printEncryptSenderInfo']) {
$values[] = self::encryptAddress($sAddress);
} else {
$values[] = $sAddress;
}
break;
case 'sProvince':
$values[] = $trade['senderAddress'] ? $trade['senderAddress']['provinceName'] : $sAdd['provinceName'];;
break;
case 'sCity':
$values[] = $trade['senderAddress'] ? $trade['senderAddress']['cityName'] : $sAdd['cityName'];
break;
case 'departure':
$values[] = $trade['senderAddress'] ? $trade['senderAddress']['provinceName'] . $trade['senderAddress']['cityName'] : $sAdd['provinceName'] . $sAdd['cityName'];
break;
case 'rName':
$values[] = $opSetting['printEncryptReceiverInfo'] ? self::encryptFullname($realConsigneeInfo['fullname']) : $realConsigneeInfo['fullname'];
break;
case 'rPhone':
if (empty($realConsigneeInfo['mobile'])) {
$rPhone = $realConsigneeInfo['telephone'];
} else {
$rPhone = $realConsigneeInfo['mobile'];
if (!empty($realConsigneeInfo['virtualNumberSuffix'])) {
$rPhone += ('-' + $realConsigneeInfo['virtualNumberSuffix']);
}
}
$values[] = $opSetting['printEncryptReceiverInfo'] ? self::encryptTelephone($rPhone) : $rPhone;
break;
case 'rTel':
$rPhone = $realConsigneeInfo['telephone'];
$values[] = $opSetting['printEncryptReceiverInfo'] ? self::encryptTelephone($rPhone) : $rPhone;
break;
case 'rAddress':
$rAddress = $realConsigneeInfo['province'] . $realConsigneeInfo['city'] . $realConsigneeInfo['county'] . $realConsigneeInfo['town'] . $realConsigneeInfo['address'];
$values[] = $opSetting['printEncryptReceiverInfo'] ? self::encryptAddress($rAddress) : $rAddress;
break;
case 'rProvince':
$values[] = $realConsigneeInfo['province'];
break;
case 'rCity':
$values[] = $realConsigneeInfo['city'];
break;
case 'rCounty':
$values[] = $realConsigneeInfo['county'];
break;
case 'rTown':
if ($realConsigneeInfo['town']) {
$values[] = $realConsigneeInfo['town'];
}
break;
case 'rProvinceCityCounty':
$values[] = $realConsigneeInfo['province'] . $realConsigneeInfo['city'] . $realConsigneeInfo['county'];
break;
case 'sellerMemo':
$vRemark = $trade['shopRemarks'];
$values[] = empty($vRemark) ? '' : $vRemark[0]['remark'];
break;
case 'buyerNick':
case 'buyerNick2':
case 'vPin':
$values[] = $trade['pin'];
break;
case 'cnOriginName':
case 'originName':
$values[] = $wlbInfo['originName'];
break;
case 'cnWlbBarcode':
case 'cnWlbBarcode2':
case 'cnWlbBarcode3':
case 'wlbCode':
case 'wlbBarcode':
case 'wlbBarcode2':
case 'wlbBarcode3':
if (!empty($wlbInfo['packageNo'])) {
$values[] = $wlbInfo['packageNo'];
} else {
$values[] = $wlbInfo['wlbCode'];
}
break;
case 'wlbAndPackageNoBarcode':
$values[] = $wlbInfo['wlbCode'] . ' - ' . $packageId . ' - ' . $wlbInfo['packageCount'] . ' - ';
break;
case 'childParentWlbCode':
$value = [];
if ($wlbInfo['isChildWaybill']) {
$value[] = '子单号:' . $wlbInfo['wlbCode'];
$value[] = '母单号:' . $wlbInfo['parentWlbCode'];
} else {
$value[] = '母单号:' . $wlbInfo['wlbCode'];
}
$values[] = implode("\n", $value);
break;
case 'consolidationName':
if (empty($wlbInfo['consolidationName']) && $opSetting['customConsolidationNameType'] == 1) {
$values[] = $realConsigneeInfo['province'] . ' ' . $realConsigneeInfo['city'] . ' ' . $realConsigneeInfo['county'];
} elseif (empty($wlbInfo['consolidationName']) && $opSetting['customConsolidationNameType'] == 2) {
$values[] = $realConsigneeInfo['city'];
} else {
$values[] = $wlbInfo['consolidationName'];
}
break;
case 'consolidationCode':
case 'consolidationBarcode':
$values[] = $wlbInfo['consolidationCode'];
break;
case 'cnRouteCode':
$values[] = $wlbInfo['routeCode'];
break;
case 'shortName':
$values[] = $wlbInfo['shortName'];
break;
case 'road':
$values[] = $wlbInfo['road'];
break;
case 'originCode':
$values[] = $wlbInfo['originCode'];
break;
case 'targeCode':
$values[] = $wlbInfo['targeCode'];
break;
case 'targetName':
$values[] = $wlbInfo['targetName'];
break;
case 'waybillProductType':
$values[] = $wlbInfo['waybillProductType'];
break;
case 'waybillServiceType':
$values[] = $wlbInfo['waybillServiceType'];
break;
case 'waybillAddedService':
$values[] = $wlbInfo['waybillAddedService'];
break;
case 'psn':
if ($packageId) {
$values[] = ($wlbInfo['packageIdAndPsnMap'] && $wlbInfo['packageIdAndPsnMap'][$packageId]) ? $wlbInfo['packageIdAndPsnMap'][$packageId] : '';
}
break;
case 'batchNum':
$values[] = $trade['batchNum'];
break;
case 'ordId':
if ($printType == 'itemTag') {
$values[] = $trade['selfOrderNum'] ?: $item['orderId'];
} else {
$values[] = $trade['selfOrderNum'] ?: implode(",", $trade['orderIds']);
}
break;
case 'ordIdBarcode':
$values[] = $trade['selfOrderNum'] ?: $trade['tradeKey'];
break;
case 'ordStartTime':
$values[] = $trade['orderStartTime'];
break;
case 'ordPaymentTime':
$values[] = $trade['paymentConfirmTime'];
break;
case 'ordRemark':
$values[] = self::buildOrderRemark($trade['orderRemarks'], $expressTpl, $printType);
break;
case 'vRemark':
$values[] = self::buildShopRemark($trade['venderRemarks'], $expressTpl, $printType);
break;
case 'shopNote':
$values[] = self::buildOrderRemark($trade['venderNotes'], $expressTpl, $printType);
break;
case 'totalNums':
$validItemTotal = 0;
foreach ($trade['orders'] as $order) {
foreach ($order['items'] as $item) {
if (CommonTool::isTrue($item['isCanPrint'])) {
$validItemTotal += $item['itemTotal'];
}
}
}
$values[] = $validItemTotal;
break;
case 'totalWeight':
$values[] = self::getAllItemWeight($trade['orders']);
break;
case 'totalFees':
$values[] = $trade['mergeOrderTotal'];
break;
case 'orderTotal':
if ($trade['mergeOrderTotalAmount']) {
$values[] = $trade['mergeOrderTotalAmount'];
} else {
$values[] = $trade['mergeOrderTotal'];
}
break;
case 'orderSellerPrice':
$values[] = $trade['mergeOrderSellerPrice'];
break;
case 'ordLogisticsName':
$values[] = $trade['logisticsName'];
break;
case 'ordWaybill':
$values[] = $trade['waybill'];
break;
case 'ordPayType':
$values[] = $trade['payType'] ? $trade['payType'] : '';
break;
case 'codFees':
if ($trade['payType'] == '0') {
$values[] = $trade['mergePayment'];
} else {
$values[] = '0';
}
break;
case 'totalDiscounts':
$values[] = $trade['mergeDiscounts'];
break;
case 'totalPosts':
$values[] = $trade['mergeFreightPrice'];
break;
case 'shopName':
$values[] = $trade['shopName'];
break;
case 'invoiceInfo':
$values[] = $trade['invoiceInfo'];
break;
case 'invoiceType':
$values[] = $trade['invoiceType'];
break;
case 'invoiceHeader':
$values[] = $trade['invoiceHeader'];
break;
case 'invoiceContent':
$values[] = $trade['invoiceContent'];
break;
case 'invoiceCode':
$values[] = $trade['invoiceCode'];
break;
case 'printCount':
$values[] = $trade['printCount'];
break;
case 'printSerialNum':
$values[] = $trade['printSerialNum'];
break;
case 'wlbSerialNum':
$values[] = $trade['wlbSerialNum'];
break;
case 'wlbSerialCount':
$values[] = $trade['wlbSerialCount'];
break;
case 'packageNo':
$values[] = $packageId;
break;
case 'packageCount':
$values[] = $trade['printPackageCount'];
break;
case 'itemImg':
$values[] = $item['logo'];
break;
case 'itemSkuWeight':
if ($item['shortWeight']) {
$values[] = $item['shortWeight'];
} else if ($item['weight']) {
$values[] = $item['weight'];
}
break;
case 'itemTitle':
if ($item['shortTitle']) {
$values[] = $item['shortTitle'];
} elseif ($item['name']) {
$values[] = $item['name'];
} elseif ($item['skuName']) {
$skuSubName = $item['skuSubName'] ?: '';
$values[] = str_replace($item['skuName'], $skuSubName, '');
}
break;
case 'itemOrdSkuName':
$values[] = $item['skuName'] ?: '';
break;
case 'skuSubName':
case 'itemSubName':
$values[] = $item['skuSubName'] ?: '';
break;
case 'outerSkuId':
case 'itemOuterSkuId':
$value = $item['outerSkuId'] ?: ($item['cargoNumber'] ?: '');
break;
case 'itemNum':
case 'itemNumBarcode':
$values[] = $item['itemNum'] ?: '';
break;
case 'itemQty':
$values[] = $item['itemPrintTotal'] ?: $item['itemTotal'];
break;
case 'itemPrice':
$values[] = $item['jdPrice'] ?: $item['price'] ?: '';
break;
case 'itemCouponPrice':
$values[] = $item['couponPrice'] ?: '';
break;
case 'itemTotalPrice':
$values[] = $item['totalPrice'] ?: '';
break;
case 'itemSkuId':
$values[] = $item['skuId'] ?: '';
break;
case 'navigationMark':
$values[] = $wlbInfo['navigationMark'];
break;
case 'transportationMode':
$values[] = $wlbInfo['transportationMode'];
break;
case 'fromBranchName':
$values[] = $wlbInfo['fromBranchName'];
break;
case 'toBranchName':
$values[] = $wlbInfo['toBranchName'];
break;
case 'orderSign':
$values[] = $wlbInfo['orderSign'];
break;
case 'expressPayMethod':
$values[] = $wlbInfo['expressPayMethod'];
break;
case 'ordInsureMoney':
$values[] = $wlbInfo['ordInsureMoney'];
break;
}
}
return $values;
}
public static function encryptFullname($fullname) {
if (!$fullname) {
return '';
}
if (mb_strlen($fullname) < 2) {
return '***';
} else {
return mb_substr($fullname, 0, 1) . '*';
}
}
public static function encryptTelephone($telephone) {
if (!$telephone) {
return '';
}
$len = strlen($telephone);
if ($len < 7) {
return '******';
} else if ($len < 11) {
return preg_replace('/(\d{2})(\d+)(\d{2})/', '$1***$3', $telephone);
} else {
return preg_replace('/(\d{3})(\d+)(\d{4})/', '$1***$3', $telephone);
}
}
public static function encryptAddress($address) {
if (!$address) {
return '';
}
if (strpos($address, '*') !== false) {
return $address;
}
return CommonTool::ensconceString($address, 'sensitiveAddress');
}
public static function getAllItemWeight($orders) {
$w = 0;
foreach ($orders as $k => $order) {
foreach ($order['items'] as $s => $item) {
$shortWeight = $item['shortWeight'] ?: 0;
$weight = $item['weight'] ?: 0;
$itemPrintTotal = $item['itemPrintTotal'] ?: $item['itemTotal'];
$w += ($shortWeight ?: $weight) * $itemPrintTotal;
}
}
return $w . 'KG';
}
public static function buildOrderRemark($orderRemarks, $expressTpl, $printType) {
$separateChar = "\r\n";
if ($expressTpl['isMergeOrderRemarkLinefeed'] == 0 && in_array($printType, [OrderPrintConst::printTypeExpress, OrderPrintConst::printTypeInvoice])) {
$separateChar = " ";
}
return implode($separateChar, array_filter($orderRemarks));
}
public static function buildShopRemark($shopRemarks, $expressTpl, $printType) {
$separateChar = "\r\n";
if ($expressTpl['isMergeOrderRemarkLinefeed'] == 0 && in_array($printType, [OrderPrintConst::printTypeExpress, OrderPrintConst::printTypeInvoice])) {
$separateChar = " ";
}
$remarks = array_column($shopRemarks, 'venderRemark');
return implode($separateChar, array_filter($remarks));
}
public static function getWaybillBarCodeType($logisticsCode) {
$barCodeTypeMap = [
"SF" => "128AUTO",
"ZJS" => "128A",
"EMS" => "128A",
"HTKY" => "128C",
"ZTO" => "128AUTO",
"UC" => "128C",
"STO" => "128A",
"QFKD" => "128B",
"TTKDEX" => "128C",
"POSTB" => "128A",
"FAST" => "128A",
"YTO" => "128A",
"GTO" => "128C",
"YUNDA" => "128B",
"DBKD" => "128C",
"JD" => "128A",
];
return $barCodeTypeMap[$logisticsCode] ?: "128AUTO";
}
public static function compareOldNv($nv) {
if (empty($nv)) {
return [];
}
if (!empty($nv['field']) && $nv['field'] != 'wlbBarcode2') {
$nv['field'] = preg_replace('/([a-zA-Z]+)([\d])$/', '$1', $nv['field']);
}
if ($nv['field'] == 'customQrCode' && $nv['name'] == 'customQrCode') {
$nv['name'] = '#二维码#';
} else if (!empty($nv['name']) && strpos($nv['name'], '#') === false) {
$nv['name'] = '#' . preg_replace('/-[0-9]{1}/', '', $nv['name']) . '#';
}
if ($nv['field'] == 'customField') {
$nv['field'] = '';
$nv['name'] = '';
$nv['before'] = $nv['value'];
}
if ($nv['field'] == 'customQrCode' && !empty($nv['value'])) {
$nv['before'] = $nv['value'];
$nv['value'] = '';
}
return $nv;
}
public static function getFieldText($fieldName) {
$expressOrderFieldsMap = LogisticsConst::getExpressOrderFieldsMap();
$receiverFieldsMap = LogisticsConst::getReceiverFieldsMap();
$sellerFieldsMap = LogisticsConst::getSellerFieldsMap();
$orderItemsFieldsMap = array_column(LogisticsConst::getOrderItemsFieldsMap(), null, 'field');
$filedText = '';
if ($expressOrderFieldsMap[$fieldName]) {
$filedText = '#' . $expressOrderFieldsMap[$fieldName] . '#';
} elseif ($receiverFieldsMap[$fieldName]) {
$filedText = '#' . $receiverFieldsMap[$fieldName] . '#';
} elseif ($sellerFieldsMap[$fieldName]) {
$filedText = '#' . $sellerFieldsMap[$fieldName] . '#';
} elseif ($orderItemsFieldsMap[$fieldName]['value']) {
$filedText = '#' . $orderItemsFieldsMap[$fieldName]['value'] . '#';
}
return $filedText;
}
public static function transferStyle($style) {
$newStyle = [];
foreach ($style as $key => $value) {
$newStyle[CommonTool::toCamelCase($key, '-')] = $value;
}
return $newStyle;
}
public static function transferOldNode($node) {
if (empty($node)) {
return [];
}
$style = $node['style'];
$newType = self::transferStyle($style);
if (!empty($node['type'])) {
$node['style'] = $newType;
return $node;
}
$nv = self::compareOldNv($node['nv']);
$newNode = [];
$newNode['style'] = $newType;
if (empty($nv['field'])) {
$nv['field'] = '';
}
if ($nv['field'] == 'line') {
$newNode['type'] = 'line';
$newNode['lineType'] = $nv['lineType'];
} else if ($nv['field'] == 'logo' || $nv['field'] == 'image' || $nv['field'] == 'imgUrl') {
if ($nv['field'] == 'logo' || $nv['imageType'] == 'logo') {
$newNode['type'] = 'logo';
} else {
$newNode['type'] = 'image';
}
if ($nv['field'] == 'imgUrl') {
$newNode['imgSrc'] = $nv['before'];
} else {
$newNode['imgSrc'] = $nv['imgSrc'];
$newNode['imgPath'] = $nv['imgPath'] ?: '';
}
} else if ($nv['field'] == 'customQrCode') {
$before = $nv['before'] ?: '';
$after = $nv['after'] ?: '';
$url = $before + $after;
$newNode['type'] = 'qrcode';
$newNode['url'] = $url;
} else if ($nv['field'] == 'itemTable') {
$columns = [];
foreach ($nv['columns'] as $i => $column) {
$cnv = $column['nv'];
$fieldNameStr = $cnv['field'] ?: '';
$fieldNames = explode(',', $fieldNameStr);
$fields = [];
if (!empty($cnv['before'])) {
$before = count($fieldNames) > 1 ? ($cnv['before'] . ' ') : $cnv['before'];
$fields[] = [
'name' => 'customContent',
'text' => $before
];
}
foreach ($fieldNames as $i => $name) {
$field = [
'name' => $name,
'text' => self::getFieldText($name),
];
$fields[] = $field;
if (($i + 1) < count($fieldNames)) {
$fields[] = [
'name' => 'customContent',
'text' => ' '
];
}
}
if (!empty($cnv['after'])) {
$after = count($fields) > 1 ? (' ' . $cnv['after']) : $cnv['after'];
$fields[] = [
'name' => 'customContent',
'text' => $after
];
}
$columns[] = [
'title' => $cnv['title'],
'fields' => $fields,
'width' => $column['style']['width'] ?: '50px'
];
}
if ($nv['titleRowStyle']['font-size']) {
$fontSize = $style['font-size'] ?: $style['fontSize'];
$nv['titleRowStyle']['fontSize'] = OrderPrintTool::convertPx2Pt($fontSize) . 'pt';
}
if (empty($nv['titleRowStyle']['fontWeight'])) {
$nv['titleRowStyle']['fontWeight'] = 'bold';
}
if (empty($nv['titleRowStyle']['fontStyle'])) {
$nv['titleRowStyle']['fontStyle'] = 'normal';
}
$newNode = [
'type' => 'itemTable',
'columns' => $columns,
'borderColor' => $nv['borderColor'] ?: '#000',
'borderSize' => $nv['borderSize'] ?: '1',
'titleStyle' => $nv['titleRowStyle'],
'bodyStyle' => [
'fontFamily' => '微软雅黑',
'fontSize' => '10pt',
'fontStyle' => 'normal',
'fontWeight' => '400',
'textAlign' => 'center',
'height' => $nv['rowHeight'] ?: '26px'
],
'style' => [
'top' => $style['top'],
'left' => $style['left'],
]
];
} else if (strpos($nv['field'], 'itemInfo') !== false) {
$newNode['type'] = 'itemInfo';
$newNode['beforeFields'] = [];
$newNode['fields'] = [];
$newNode['afterFields'] = [];
if ($nv['before']) {
$newNode['beforeFields'][] = [
'name' => 'customContent',
'text' => $nv['before']
];
}
if ($nv['after']) {
$newNode['afterFields'][] = [
'name' => 'customContent',
'text' => $nv['after']
];
}
$value = ' ';
$separator = $nv['separator'] ?: 'space';
if ($nv['separator'] == 'comma') {
$value = '';
} else if ($nv['separator'] == 'semicolon') {
$value = '';
} else if ($nv['separator'] == 'slash') {
$value = '/';
}
$separator = [
'name' => 'customContent',
'text' => $value
];
$fieldNameStr = $nv['field'] ?: '';
$fieldNames = explode(',', $fieldNameStr);
$curIsBeforeField = true;
foreach ($fieldNames as $i => $name) {
if ($name == 'itemInfo') {
$curIsBeforeField = false;
continue;
}
$field = [
'name' => $name,
'text' => self::getFieldText($name),
];
if ($curIsBeforeField) {
if (count($newNode['beforeFields']) > 1) {
$newNode['beforeFields'][] = $separator;
}
$newNode['beforeFields'][] = $field;
} else {
if (count($newNode['afterFields']) > 1) {
$newNode['afterFields'][] = $separator;
}
$newNode['afterFields'][] = $field;
}
}
if (count($newNode['beforeFields']) > 1) {
$newNode['beforeFields'][] = [
'name' => 'lineBreak',
'text' => '换行'
];
}
} else if (strpos($nv['field'], 'Barcode') !== false) {
$newNode['type'] = 'barcode';
if (in_array($nv['field'], ['wlbBarcode', 'wlbBarcode2', 'wlbBarcode3'])) {
$newNode['name'] = 'wlbBarcode';
if ($nv['after']) {
$newNode['name'] = 'wlbAndPackageNoBarcode';
}
} else {
$newNode['name'] = $nv['field'];
}
if ($nv['field'] == 'wlbBarcode' || $nv['field'] == 'consolidationBarcode') {
$newNode['showBarcodeContent'] = 1;
} else {
$newNode['showBarcodeContent'] = 0;
}
} else {
$newNode['type'] = 'normal';
$fieldNameStr = $nv['field'] ?: '';
$fieldNames = explode(',', $fieldNameStr);
$needCombineBeforeAfter = true;
$fields = [];
foreach ($fieldNames as $i => $name) {
$field = [
'name' => $name,
'text' => self::getFieldText($name),
];
$fields[] = $field;
if ($name == 'wlbCode' && $nv['after']) {
$fields[] = [
'name' => 'customContent',
'text' => '-'
];
$fields[] = [
'name' => 'packageNo',
'text' => self::getFieldText('packageNo'),
];
$fields[] = [
'name' => 'customContent',
'text' => '-'
];
$fields[] = [
'name' => 'packageCount',
'text' => self::getFieldText('packageCount'),
];
$fields[] = [
'name' => 'customContent',
'text' => '-'
];
$needCombineBeforeAfter = false;
}
if (($i + 1) < count($fieldNames)) {
$value = ' ';
$separator = $nv['separator'] ?: 'space';
if ($nv['separator'] == 'comma') {
$value = '';
} else if ($nv['separator'] == 'semicolon') {
$value = '';
} else if ($nv['separator'] == 'slash') {
$value = '/';
}
$fields[] = [
'name' => 'customContent',
'text' => $value
];
}
}
if ($needCombineBeforeAfter && ($nv['before'] || $nv['after'])) {
if ($nv['before'] == '1/1') {
array_unshift($fields, [
'name' => 'packageCount',
'text' => self::getFieldText('packageCount'),
]);
array_unshift($fields, [
'name' => 'customContent',
'text' => '/'
]);
array_unshift($fields, [
'name' => 'packageNo',
'text' => self::getFieldText('packageNo'),
]);
} else if ($nv['before']) {
array_unshift($fields, [
'name' => 'customContent',
'text' => $nv['before']
]);
}
if ($nv['after']) {
$fields[] = [
'name' => 'customContent',
'text' => $nv['after']
];
}
}
$newNode['fields'] = $fields;
}
return $newNode;
}
}