快递资料接入合同甲乙方并联动协议签署 #341
@ -2264,6 +2264,7 @@ class Pages extends Controller
|
||||
$receiptStats = null;
|
||||
$agreementCourierNames = $this->agreementCourierNames($page['slug'] ?? null);
|
||||
$agreementCourierAccounts = $this->agreementCourierAccounts($page['slug'] ?? null, $agreementCourierNames);
|
||||
$agreementCourierContractParties = $this->agreementCourierContractParties($page['slug'] ?? null, $agreementCourierNames);
|
||||
$agreementSupplierOptions = $this->agreementSupplierOptions($page['slug'] ?? null);
|
||||
|
||||
// 内部流转报表读取共享业务镜像中由工作簿导入的数据集,不走上游只读查询。
|
||||
@ -2342,6 +2343,7 @@ class Pages extends Controller
|
||||
'agreementSubjects' => $this->agreementSubjects($page['slug']),
|
||||
'agreementCourierNames' => $agreementCourierNames,
|
||||
'agreementCourierAccounts' => $agreementCourierAccounts,
|
||||
'agreementCourierContractParties' => $agreementCourierContractParties,
|
||||
'agreementSupplierOptions' => $agreementSupplierOptions,
|
||||
'agreementQuoteVersions' => $this->agreementQuoteVersions($page['slug']),
|
||||
'inventoryWarehouseMappings' => $inventoryWarehouseMappings,
|
||||
@ -2403,6 +2405,7 @@ class Pages extends Controller
|
||||
'agreementSubjects' => $this->agreementSubjects($page['slug'] ?? null),
|
||||
'agreementCourierNames' => $agreementCourierNames,
|
||||
'agreementCourierAccounts' => $agreementCourierAccounts,
|
||||
'agreementCourierContractParties' => $agreementCourierContractParties,
|
||||
'agreementSupplierOptions' => $agreementSupplierOptions,
|
||||
'agreementQuoteVersions' => $this->agreementQuoteVersions($page['slug'] ?? null),
|
||||
'inventoryWarehouseMappings' => $inventoryWarehouseMappings,
|
||||
@ -2861,6 +2864,22 @@ class Pages extends Controller
|
||||
return $accounts;
|
||||
}
|
||||
|
||||
/** @return array<string,array{party_b:string,party_a:string,ambiguous:bool}> */
|
||||
protected function agreementCourierContractParties(?string $page, Collection $courierNames): array
|
||||
{
|
||||
if ($page !== 'agreement-signing') {
|
||||
return [];
|
||||
}
|
||||
|
||||
try {
|
||||
return $this->courierInformation->contractPartiesByName($courierNames->values()->all());
|
||||
} catch (Throwable $exception) {
|
||||
report($exception);
|
||||
|
||||
return [];
|
||||
}
|
||||
}
|
||||
|
||||
protected function agreementTasks(?string $page): Collection|\Illuminate\Contracts\Pagination\LengthAwarePaginator
|
||||
{
|
||||
if ($page !== 'agreement-signing') {
|
||||
@ -6490,7 +6509,7 @@ class Pages extends Controller
|
||||
fputcsv($csv, [
|
||||
'ID', '快递公司代码', '快递公司名称', '外部编码', '杉橙快递代码', '运费打款方式',
|
||||
'是否启用', '可达服务', '是否快运', '自动寻号', '配货单号寻号', '数量拆单', '重量0寻号',
|
||||
'停运时间', '合同开始时间', '合同结束时间', '联系人', '联系电话', '自定义1', '自定义2', '扣款方式',
|
||||
'停运时间', '合同主体', '合同开始时间', '合同结束时间', '签订公司', '联系人', '联系电话', '自定义1', '自定义2', '扣款方式',
|
||||
'体积0寻号', '手工单号', '解密', '电子签章经办人', '最后修改',
|
||||
'入驻单号', '入驻状态', '入驻主体',
|
||||
...array_map(static fn (string $field): string => \App\Models\Business\CourierOnboarding::PROFILE_FIELDS[$field][0], \App\Business\CourierProfileData::APPENDED_PROFILE_FIELDS),
|
||||
@ -6531,8 +6550,10 @@ class Pages extends Controller
|
||||
$bool($row->skucountsplitsgn ?? null),
|
||||
$bool($row->weight0sgn ?? null),
|
||||
$date($row->stopdate ?? null),
|
||||
$this->csvText($row->tradebody ?? null),
|
||||
$date($row->tradebtime ?? null),
|
||||
$date($row->tradeetime ?? null),
|
||||
$this->csvText($row->signcom ?? null),
|
||||
$this->csvText($row->linker ?? null),
|
||||
$this->csvText($row->linkmobile ?? null),
|
||||
$this->csvText($row->undefined1 ?? null),
|
||||
|
||||
@ -76,7 +76,7 @@
|
||||
| 库存与货款对账 | `dbo.pm_boardInventoryDetail_snapshot`、`dbo.fys_supplierGoods_sttlement_purchase`、`dbo.fys_supplierGoods_sttlement_sale`、`dbo.pm_purchaseIn` |
|
||||
| 采购单价 | `dbo.jst_purchase`、`dbo.jst_purchaseItem`(受控字段联表镜像,不复制其他采购业务字段) |
|
||||
| 工作平台采购价格 | `dbo.pm_priceAdjustment`(`Id` 稳定键;按 `skuCode` 匹配 `jst_sku.sku_id`,页面取当前已生效的最新 `purchasePrice` / `effectTime`) |
|
||||
| 快递资料 | `dbo.wp_express`、`dbo.wp_express_expNet`、`dbo.wp_express_account`、`dbo.wp_express_extension` |
|
||||
| 快递资料 | `dbo.wp_express`、`dbo.wp_express_expNet`、`dbo.wp_express_account`、`dbo.wp_express_extension`。`wp_express.tradebody` 为合作合同乙方(合同主体),`signcom` 为甲方(签订公司),主资料列表与导出读取这两个原始镜像字段。协议签署选择快递后按确切名称带入唯一乙方主体,缺失或同名主体冲突时保留空值并提示核对,不以快递简称替代,也不改写已签归档合同。 |
|
||||
| 聚水潭小额打款工单 | `dbo.jst_workOrderInfo`(稳定键 `Id`、增量字段 `updateTime`)与 `dbo.jst_small_payment_order_map`(稳定键 `woNo`、增量字段 `updated_at`) |
|
||||
| 拼多多货款账户账单 | `dbo.jst_originalBillInfo`(固定 `channel = PinduoduoImport`,镜像 `js_jst_pdd_receiving_bill_rows`) |
|
||||
| 得物完整账户账单 | 聚胜算平台原始账单(新)XLSX(受控导入 `dewu_settlement_bill_rows`;保留得物、退货退款订单、扣减其他费用明细) |
|
||||
|
||||
@ -309,6 +309,40 @@ class CourierInformationMirrorRepository
|
||||
->all();
|
||||
}
|
||||
|
||||
/**
|
||||
* 工作平台合同主体为乙方、签订公司为甲方;同名但主体不唯一时不猜选。
|
||||
*
|
||||
* @param list<string> $expnames
|
||||
* @return array<string,array{party_b:string,party_a:string,ambiguous:bool}>
|
||||
*/
|
||||
public function contractPartiesByName(array $expnames): array
|
||||
{
|
||||
if (! $this->ready() || $expnames === []) {
|
||||
return [];
|
||||
}
|
||||
|
||||
return $this->connection->table($this->dataset()->targetTable())
|
||||
->select(['expname', 'tradebody', 'signcom'])
|
||||
->whereIn('expname', $expnames)
|
||||
->where(static fn (Builder $query) => $query->whereNull('is_delete')->orWhere('is_delete', '<>', 1))
|
||||
->get()
|
||||
->groupBy(static fn ($row): string => trim((string) $row->expname))
|
||||
->map(static function ($rows): array {
|
||||
$subjects = static fn (string $field) => $rows->pluck($field)
|
||||
->map(static fn ($value): string => trim((string) $value))
|
||||
->filter(static fn (string $value): bool => $value !== '')
|
||||
->unique()->values();
|
||||
$partyB = $subjects('tradebody');
|
||||
$partyA = $subjects('signcom');
|
||||
|
||||
return [
|
||||
'party_b' => $partyB->count() === 1 ? $partyB->first() : '',
|
||||
'party_a' => $partyA->count() === 1 ? $partyA->first() : '',
|
||||
'ambiguous' => $partyB->count() > 1,
|
||||
];
|
||||
})->all();
|
||||
}
|
||||
|
||||
/**
|
||||
* 快递资料操作日志。
|
||||
* @return array{data:list<object>,total:int}
|
||||
@ -366,7 +400,7 @@ class CourierInformationMirrorRepository
|
||||
$query = $this->connection->table($this->dataset()->targetTable())->select([
|
||||
'Id', 'expcode', 'expname', 'outcode', 'scexpcode', 'status', 'paymethod',
|
||||
'addvalidsgn', 'kuaiyunsgn', 'autonosgn', 'packnosgn', 'skucountsplitsgn',
|
||||
'weight0sgn', 'stopdate', 'tradebtime', 'tradeetime', 'signcom', 'signmode',
|
||||
'weight0sgn', 'stopdate', 'tradebody', 'tradebtime', 'tradeetime', 'signcom', 'signmode',
|
||||
'linker', 'linkmobile', 'paytype', 'undefined1', 'undefined2', 'undefined3',
|
||||
'volume0sgn', 'handnosgn', 'decryptsgn', 'pj1sgn', 'undefinedtype',
|
||||
'undefined4', 'undefined5', 'dzqzjbr', 'guid', 'is_delete', 'exp_properties',
|
||||
|
||||
@ -3,6 +3,7 @@
|
||||
@php($agreementSubjects = $agreementSubjects ?? collect())
|
||||
@php($agreementCourierNames = collect($agreementCourierNames ?? []))
|
||||
@php($agreementCourierAccounts = $agreementCourierAccounts ?? [])
|
||||
@php($agreementCourierContractParties = $agreementCourierContractParties ?? [])
|
||||
@php($agreementSupplierOptions = $agreementSupplierOptions ?? [])
|
||||
@php($supplierContractTemplates = \App\Support\SupplierCooperationTemplates::TEMPLATES)
|
||||
@php($supplierContractRequestKey = (string) \Illuminate\Support\Str::uuid())
|
||||
@ -1618,6 +1619,7 @@
|
||||
</div>
|
||||
<input type="hidden" name="supplier_id" data-signing-supplier-id disabled>
|
||||
<p class="agreement-help" data-supplier-control hidden aria-live="polite">按供应商简称、企业全称或编码搜索,选择后自动带入易签宝账号。</p>
|
||||
<p class="agreement-help" data-courier-contract-parties hidden aria-live="polite"></p>
|
||||
</div>
|
||||
<div class="agreement-field">
|
||||
<label for="agreement-document-type">文件类型 <span class="agreement-required" aria-hidden="true">*</span></label>
|
||||
@ -2346,6 +2348,9 @@
|
||||
return { value: option.value, account: option.dataset.esignAccount || '' };
|
||||
}) : [];
|
||||
var originalCourierOptions = courierOptions;
|
||||
var courierContractParties = @json($agreementCourierContractParties);
|
||||
var courierContractPartiesHelp = root.querySelector('[data-courier-contract-parties]');
|
||||
var selectedContractCourier = '';
|
||||
var selectedSupplierId = '';
|
||||
var visibleCourierIndexes = [];
|
||||
var activeCourierIndex = -1;
|
||||
@ -2852,6 +2857,8 @@
|
||||
var supplier = type === 'supplier';
|
||||
if (type !== currentPartnerType) {
|
||||
closeCourierOptions();
|
||||
selectedContractCourier = '';
|
||||
courierContractPartiesHelp.hidden = true;
|
||||
courierSelect.value = '';
|
||||
courierSearch.value = '';
|
||||
esignAccountInput.value = '';
|
||||
@ -2957,6 +2964,23 @@
|
||||
refreshPreview();
|
||||
}
|
||||
|
||||
function syncCourierContractParties() {
|
||||
var name = currentPartnerType === 'courier' ? courierSelect.value : '';
|
||||
var parties = Object.prototype.hasOwnProperty.call(courierContractParties, name) ? courierContractParties[name] : null;
|
||||
var partyB = parties && !parties.ambiguous ? parties.party_b : '';
|
||||
if (selectedContractCourier !== name) {
|
||||
selectedContractCourier = name;
|
||||
var partyBInput = form.querySelector('[name="cooperation_party_b_name"]');
|
||||
if (partyBInput && currentPartnerType === 'courier') partyBInput.value = partyB;
|
||||
}
|
||||
courierContractPartiesHelp.hidden = name === '';
|
||||
if (name !== '') {
|
||||
courierContractPartiesHelp.textContent = parties && parties.ambiguous
|
||||
? '同名快递对应多个合同主体,未自动填入乙方,请核对快递资料后手工填写。'
|
||||
: '合同主体(乙方):' + (partyB || '未维护,请手工填写') + ';签订公司(甲方):' + (parties && parties.party_a || '未维护或不唯一,请核对') + '。乙方可按本次合同修改,甲方请核对我方签署主体。';
|
||||
}
|
||||
}
|
||||
|
||||
function syncEsignAccount() {
|
||||
if (!courierSelect || !esignAccountInput) {
|
||||
return;
|
||||
@ -2983,6 +3007,7 @@
|
||||
} else {
|
||||
selectedSupplierId = '';
|
||||
}
|
||||
syncCourierContractParties();
|
||||
|
||||
if (account !== '') {
|
||||
esignAccountInput.value = account;
|
||||
|
||||
@ -504,7 +504,7 @@
|
||||
<tr>
|
||||
<th>ID</th><th>快递公司代码</th><th>快递公司名称</th><th>外部编码</th><th>杉橙快递代码</th><th>运费打款方式</th>
|
||||
<th>是否启用</th><th>可达服务</th><th>是否快运</th><th>自动寻号</th><th>配货单号寻号</th><th>数量拆单</th><th>重量0寻号</th>
|
||||
<th>停运时间</th><th>合同开始时间</th><th>合同结束时间</th><th>联系人</th><th>联系电话</th><th>自定义1</th><th>自定义2</th><th>扣款方式</th>
|
||||
<th>停运时间</th><th title="合作合同的乙方">合同主体</th><th>合同开始时间</th><th>合同结束时间</th><th title="合作合同的甲方">签订公司</th><th>联系人</th><th>联系电话</th><th>自定义1</th><th>自定义2</th><th>扣款方式</th>
|
||||
<th>体积0寻号</th><th>手工单号</th><th>解密</th><th>电子签章经办人</th><th>最后修改</th>
|
||||
<th class="is-onboarding">入驻单号</th><th class="is-onboarding">入驻状态</th><th class="is-onboarding">ERP 开通</th><th class="is-onboarding">入驻主体</th>@foreach (\App\Business\CourierProfileData::APPENDED_PROFILE_FIELDS as $profileField)<th class="is-onboarding">{{ \App\Models\Business\CourierOnboarding::PROFILE_FIELDS[$profileField][0] }}</th>@endforeach
|
||||
<th class="is-onboarding">证照</th><th class="is-onboarding">生效报价</th>
|
||||
@ -541,8 +541,10 @@
|
||||
<td>{{ $onlyOnboarding ? '-' : $bool($row->skucountsplitsgn ?? null) }}</td>
|
||||
<td>{{ $onlyOnboarding ? '-' : $bool($row->weight0sgn ?? null) }}</td>
|
||||
<td class="{{ $cell('stopdate') }}">{{ $date($row->stopdate ?? null) }}</td>
|
||||
<td class="is-clamped" title="{{ $row->tradebody ?? '' }}">{{ filled($row->tradebody ?? null) ? $row->tradebody : '-' }}</td>
|
||||
<td class="{{ $cell('tradebtime') }}" @if ($onlyOnboarding) title="协议签署 · 合作合同(已签署)" @endif>{{ $date($row->tradebtime ?? null) }}</td>
|
||||
<td class="{{ $cell('tradeetime') }}" @if ($onlyOnboarding) title="协议签署 · 合作合同(已签署)" @endif>{{ $date($row->tradeetime ?? null) }}</td>
|
||||
<td class="is-clamped" title="{{ $row->signcom ?? '' }}">{{ filled($row->signcom ?? null) ? $row->signcom : '-' }}</td>
|
||||
<td class="{{ $cell('linker') }}">{{ $row->linker ?? '-' }}</td>
|
||||
<td class="{{ $cell('linkmobile') }}">{{ $row->linkmobile ?? '-' }}</td>
|
||||
<td class="{{ $cell('undefined1') }}">{{ $row->undefined1 ?? '-' }}</td>
|
||||
@ -556,7 +558,7 @@
|
||||
@include('business.pages.courier-payables.partials.courier-onboarding-cells', ['info' => $row->_info ?? null, 'platformName' => $row->expname ?? null, 'platformCode' => $row->expcode ?? null])
|
||||
</tr>
|
||||
@empty
|
||||
<tr><td colspan="42" class="courier-information-empty">{{ $courierError ? '数据暂时不可用。' : '当前筛选条件下没有快递资料。' }}</td></tr>
|
||||
<tr><td colspan="44" class="courier-information-empty">{{ $courierError ? '数据暂时不可用。' : '当前筛选条件下没有快递资料。' }}</td></tr>
|
||||
@endforelse
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
@ -154,9 +154,12 @@ class AgreementSigningPageTest extends FeatureTestCase
|
||||
->once()
|
||||
->with(['顺丰', '韵达'])
|
||||
->andReturn(['顺丰' => '13800000001']);
|
||||
$courierInformation->shouldReceive('contractPartiesByName')->once()->with(['顺丰', '韵达'])->andReturn([
|
||||
'顺丰' => ['party_b' => '乙方顺丰物流有限公司', 'party_a' => '甲方商贸有限公司', 'ambiguous' => false],
|
||||
]);
|
||||
$this->app->instance(CourierInformationMirrorRepository::class, $courierInformation);
|
||||
|
||||
$this->loginAs()
|
||||
$response = $this->loginAs()
|
||||
->get(route('business.pages.show', [
|
||||
'section' => 'courier-payables',
|
||||
'page' => 'agreement-signing',
|
||||
@ -167,7 +170,10 @@ class AgreementSigningPageTest extends FeatureTestCase
|
||||
->assertSee('data-courier-select required', false)
|
||||
->assertSee('<option value="顺丰" data-esign-account="13800000001">顺丰</option>', false)
|
||||
->assertSee('<option value="韵达" data-esign-account="">韵达</option>', false)
|
||||
->assertSee('data-courier-contract-parties', false)
|
||||
->assertDontSee('<option value="新北中通"', false);
|
||||
$this->assertSame('乙方顺丰物流有限公司', $response->viewData('agreementCourierContractParties')['顺丰']['party_b']);
|
||||
$this->assertSame('甲方商贸有限公司', $response->viewData('agreementCourierContractParties')['顺丰']['party_a']);
|
||||
}
|
||||
|
||||
public function testAgreementSigningPageShowsOurCompanyAsInitiator(): void
|
||||
|
||||
@ -69,6 +69,8 @@ class CourierInformationPageTest extends FeatureTestCase
|
||||
'expcode' => 'SF',
|
||||
'expname' => '顺丰速运',
|
||||
'status' => 1,
|
||||
'tradebody' => '乙方顺丰物流有限公司',
|
||||
'signcom' => '甲方商贸有限公司',
|
||||
'tradebtime' => '2026-01-01 00:00:00',
|
||||
]],
|
||||
'total' => 1,
|
||||
@ -88,6 +90,8 @@ class CourierInformationPageTest extends FeatureTestCase
|
||||
->assertSeeText('SF')
|
||||
->assertSeeText('同步正常')
|
||||
->assertSeeText('可达服务')
|
||||
->assertSeeText('合同主体')->assertSeeText('乙方顺丰物流有限公司')
|
||||
->assertSeeText('签订公司')->assertSeeText('甲方商贸有限公司')
|
||||
->assertSeeText('第 1 / 1 页,本页 1 条,共 1 条')
|
||||
->assertSee('name="expcode"', false);
|
||||
|
||||
@ -96,4 +100,26 @@ class CourierInformationPageTest extends FeatureTestCase
|
||||
$response->getContent()
|
||||
);
|
||||
}
|
||||
|
||||
public function test_export_keeps_contract_parties_in_their_own_columns(): void
|
||||
{
|
||||
$this->user->attachPermission(Permission::where('name', 'read-admin-panel')->firstOrFail());
|
||||
$repository = Mockery::mock(CourierInformationMirrorRepository::class);
|
||||
$repository->shouldReceive('available')->once()->andReturnTrue();
|
||||
$repository->shouldReceive('ready')->once()->andReturnTrue();
|
||||
$repository->shouldReceive('exportRows')->once()->andReturnUsing(static function (): \Generator {
|
||||
yield (object) [
|
||||
'Id' => 1, 'expcode' => 'EXP-1', 'expname' => '导出快递简称',
|
||||
'tradebody' => '导出乙方有限公司', 'signcom' => '=甲方公式样式名称',
|
||||
];
|
||||
});
|
||||
$this->app->instance(CourierInformationMirrorRepository::class, $repository);
|
||||
$response = $this->loginAs()->get(route('business.courier-payables.courier-information.export'))->assertOk();
|
||||
$lines = preg_split('/\r?\n/', ltrim($response->streamedContent(), "\xEF\xBB\xBF"));
|
||||
$headers = str_getcsv($lines[0]);
|
||||
$row = array_combine($headers, str_getcsv($lines[1]));
|
||||
$this->assertSame('导出乙方有限公司', $row['合同主体']);
|
||||
$this->assertSame("'=甲方公式样式名称", $row['签订公司']);
|
||||
$this->assertSame('导出快递简称', $row['快递公司名称']);
|
||||
}
|
||||
}
|
||||
|
||||
@ -136,12 +136,45 @@ class CourierInformationMirrorRepositoryTest extends TestCase
|
||||
$this->assertSame(['顺丰', '韵达'], $this->repository->names());
|
||||
}
|
||||
|
||||
public function test_contract_parties_use_source_fields_and_reject_conflicting_same_name_subjects(): void
|
||||
{
|
||||
$this->markReady(7);
|
||||
$this->insertExpress(1, ['expname' => '快递简称', 'tradebody' => ' 乙方物流有限公司 ', 'signcom' => '甲方商贸有限公司']);
|
||||
$this->insertExpress(2, ['expname' => '快递简称', 'tradebody' => '乙方物流有限公司', 'signcom' => '甲方商贸有限公司']);
|
||||
$this->insertExpress(3, ['expname' => '快递简称', 'tradebody' => '已删除的其他主体', 'is_delete' => 1]);
|
||||
$this->insertExpress(4, ['expname' => '冲突快递', 'tradebody' => '乙方一', 'signcom' => '甲方一']);
|
||||
$this->insertExpress(5, ['expname' => '冲突快递', 'tradebody' => '乙方二', 'signcom' => '甲方一']);
|
||||
$this->insertExpress(6, ['expname' => '未维护快递']);
|
||||
$this->insertExpress(7, ['expname' => '不在请求内快递', 'tradebody' => '不应返回']);
|
||||
|
||||
$this->assertSame([
|
||||
'快递简称' => ['party_b' => '乙方物流有限公司', 'party_a' => '甲方商贸有限公司', 'ambiguous' => false],
|
||||
'冲突快递' => ['party_b' => '', 'party_a' => '甲方一', 'ambiguous' => true],
|
||||
'未维护快递' => ['party_b' => '', 'party_a' => '', 'ambiguous' => false],
|
||||
], $this->repository->contractPartiesByName(['快递简称', '冲突快递', '未维护快递']));
|
||||
|
||||
$row = $this->repository->paginate(['expcode' => 'EXP-1'], 1, 10)['data'][0];
|
||||
$this->assertSame(' 乙方物流有限公司 ', $row->tradebody);
|
||||
$this->assertSame('甲方商贸有限公司', $row->signcom);
|
||||
$export = iterator_to_array($this->repository->exportRows(['expcode' => 'EXP-1']));
|
||||
$this->assertSame($row->tradebody, $export[0]->tradebody);
|
||||
$this->assertSame($row->signcom, $export[0]->signcom);
|
||||
}
|
||||
|
||||
public function test_contract_parties_remain_unavailable_until_mirror_initial_sync_is_complete(): void
|
||||
{
|
||||
$this->insertExpress(1, ['expname' => '未就绪快递', 'tradebody' => '不能使用的部分数据']);
|
||||
$this->assertSame([], $this->repository->contractPartiesByName(['未就绪快递']));
|
||||
$this->markReady(1);
|
||||
$this->assertSame([], $this->repository->contractPartiesByName([]));
|
||||
}
|
||||
|
||||
private function createExpressTable(): void
|
||||
{
|
||||
Schema::connection('business_mirror')->create('js_wp_express', function (Blueprint $table): void {
|
||||
$table->string('_mirror_key')->primary();
|
||||
$table->integer('Id');
|
||||
foreach (['expcode', 'expname', 'outcode', 'scexpcode', 'paymethod', 'signcom', 'signmode', 'linker', 'linkmobile', 'paytype', 'undefined1', 'undefined2', 'undefined3', 'undefinedtype', 'undefined4', 'undefined5', 'dzqzjbr', 'guid', 'exp_properties'] as $column) {
|
||||
foreach (['expcode', 'expname', 'outcode', 'scexpcode', 'paymethod', 'tradebody', 'signcom', 'signmode', 'linker', 'linkmobile', 'paytype', 'undefined1', 'undefined2', 'undefined3', 'undefinedtype', 'undefined4', 'undefined5', 'dzqzjbr', 'guid', 'exp_properties'] as $column) {
|
||||
$table->string($column)->nullable();
|
||||
}
|
||||
foreach (['status', 'addvalidsgn', 'kuaiyunsgn', 'autonosgn', 'packnosgn', 'skucountsplitsgn', 'weight0sgn', 'volume0sgn', 'handnosgn', 'decryptsgn', 'pj1sgn', 'is_delete'] as $column) {
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user