index.vue 43 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335
  1. <template>
  2. <div id="container" style="margin-bottom: 100px;display: flex;justify-content: center;">
  3. <div style="width:80%;">
  4. <el-form :model="form" ref="form" :rules="rules" label-position="top">
  5. <!-- 基本资料-->
  6. <div class="moduleStyle">
  7. <div class="titleBox">
  8. <span class="redBlock">&nbsp;</span>
  9. <span>基础资料</span>
  10. </div>
  11. <div class="basicData">
  12. <div class="mainModules">
  13. <el-form-item label="起运港口" prop="fLoadportid">
  14. <el-select
  15. v-model="form.fLoadportid"
  16. filterable
  17. remote
  18. @change="estimatedTime"
  19. style="width: 80%;"
  20. class="elSelect"
  21. placeholder="请输入模糊查找起运港口"
  22. :disabled="noEditing"
  23. >
  24. <el-scrollbar>
  25. <el-option
  26. v-for="(dict, index) in fMblnoOptions"
  27. :key="dict.fId"
  28. :label="dict.fName"
  29. :value="dict.fId"
  30. ></el-option>
  31. </el-scrollbar>
  32. </el-select>
  33. </el-form-item>
  34. <!-- </el-input>-->
  35. </div>
  36. <div class="mainModules">
  37. <!-- <span>目的港口</span>-->
  38. <!-- <el-input style="width:80%;margin-left:20px;top: 4px" v-model="form.fDestportid"/>-->
  39. <el-form-item label="目的港口" prop="fDestportid">
  40. <el-select
  41. v-model="form.fDestportid"
  42. filterable
  43. remote
  44. @change="estimatedTime"
  45. style="width: 80%;"
  46. :disabled="noEditing"
  47. class="elSelect"
  48. placeholder="请输入模糊查找目的港口"
  49. >
  50. <el-scrollbar>
  51. <el-option
  52. v-for="(dict, index) in fMblnoOptions"
  53. :key="dict.fId"
  54. :label="dict.fName"
  55. :value="dict.fId"
  56. ></el-option>
  57. </el-scrollbar>
  58. </el-select>
  59. </el-form-item>
  60. </div>
  61. <div class="mainModules">
  62. <!-- <span>预计装货时间</span>-->
  63. <!-- <el-input style="width:80%;margin-left:20px;top: 4px" v-model="form.fBsdate"/>-->
  64. <el-form-item label="预计装货时间" prop="fBsdate">
  65. <el-date-picker
  66. v-model="form.fBsdate"
  67. style="width:80%;"
  68. :disabled="noEditing"
  69. type="date"
  70. value-format="yyyy-MM-dd"
  71. placeholder="选择日期">
  72. </el-date-picker>
  73. </el-form-item>
  74. </div>
  75. <div class="mainModules">
  76. <el-form-item label="运输条款" prop="fServiceitems">
  77. <el-select style="width:80%;"
  78. placeholder="请选择"
  79. :disabled="noEditing"
  80. v-model="form.fServiceitems">
  81. <el-option
  82. v-for="(dict, index) in transport"
  83. :key="dict.dictValue"
  84. :label="dict.dictLabel"
  85. :value="dict.dictValue"
  86. ></el-option>
  87. </el-select>
  88. </el-form-item>
  89. </div>
  90. <div class="mainModules">
  91. <!-- <span>付款方式</span>-->
  92. <el-form-item label="付款方式" prop="fPaymode">
  93. <el-select style="width:80%;" placeholder="请选择" :disabled="noEditing"
  94. v-model="form.fPaymode">
  95. <el-option
  96. v-for="(dict, index) in paymentMethod"
  97. :key="dict.dictValue"
  98. :label="dict.dictLabel"
  99. :value="dict.dictValue"
  100. ></el-option>
  101. </el-select>
  102. </el-form-item>
  103. <!-- <el-input style="width:80%;margin-left:20px;top: 4px" v-model="form.fBillingway"></el-input>-->
  104. </div>
  105. <div class="mainModules">
  106. <el-form-item label="受票方" prop="fInvoceobj">
  107. <el-select style="width:80%;" placeholder="请选择" :disabled="noEditing"
  108. v-model="form.fInvoceobj">
  109. <el-option
  110. v-for="(dict, index) in drawee"
  111. :key="dict.dictValue"
  112. :label="dict.dictLabel"
  113. :value="dict.dictValue"
  114. ></el-option>
  115. </el-select>
  116. </el-form-item>
  117. <!-- <el-input style="width:80%;margin-left:20px;top: 4px" v-model="form.fInvoceobj"/>-->
  118. </div>
  119. <div class="mainModules">
  120. <el-form-item label="航线" prop="fLaneid">
  121. <el-select style="width:80%;" placeholder="请选择" :disabled="noEditing"
  122. v-model="form.fLaneid">
  123. <el-option
  124. v-for="(dict, index) in rouTe"
  125. :key="dict.fId"
  126. :label="dict.fName"
  127. :value="dict.fId"
  128. ></el-option>
  129. </el-select>
  130. </el-form-item>
  131. </div>
  132. <div class="mainModules">
  133. <el-form-item label="箱内签收单" prop="fSign">
  134. <!-- <el-input style="width:80%;" v-model="form.fSign"/>-->
  135. <el-select style="width:80%;" placeholder="请选择" :disabled="noEditing"
  136. v-model="form.fSign">
  137. <el-option
  138. v-for="(dict, index) in cEsign"
  139. :key="dict.dictValue"
  140. :label="dict.dictLabel"
  141. :value="dict.dictValue"
  142. ></el-option>
  143. </el-select>
  144. </el-form-item>
  145. </div>
  146. <div class="mainModules">
  147. <el-form-item label="订舱人扣货" prop="fDetentioncargo">
  148. <!-- <el-input style="width:80%;" v-model="form.fDetentioncargo"/>-->
  149. <el-select style="width:80%;" placeholder="请选择" :disabled="noEditing"
  150. v-model="form.fDetentioncargo">
  151. <el-option
  152. v-for="(dict, index) in etentioncargo"
  153. :key="dict.dictValue"
  154. :label="dict.dictLabel"
  155. :value="dict.dictValue"
  156. ></el-option>
  157. </el-select>
  158. </el-form-item>
  159. </div>
  160. <div style="width: 70%;">
  161. <el-form-item label="备注" prop="remarks" style="width: 80%;float: left;text-align: left">
  162. <el-input style="width:80%;float: left" placeholder="如有特殊需求,请再此说明" :disabled="noEditing" v-model="form.remarks"/>
  163. <el-button type="text" style="display: inline; color: red" :disabled="noEditing">附件上传<i
  164. class="el-icon-upload el-icon--right"></i></el-button>
  165. </el-form-item>
  166. </div>
  167. <!-- <div class="mainModules"></div>-->
  168. </div>
  169. </div>
  170. <!-- 预计时间-->
  171. <div class="moduleStyle">
  172. <div class="titleBox">
  173. <span class="redBlock">&nbsp;</span>
  174. <span>预计时间</span>
  175. <el-button type="primary" size="mini" style="float: right;margin-right: 20px" @click="dialogVisible = true"
  176. :disabled="!form.fLoadportid || !form.fDestportid || noEditing">查看船期
  177. </el-button>
  178. </div>
  179. <span style="color:red;display: block;margin:0 auto;margin-bottom: -20px;">{{estimaTe.pidName}}&nbsp;&nbsp;&nbsp;{{estimaTe.fNo}}</span>
  180. <!-- 步骤条-->
  181. <div style="width: 100%;" v-if="!estimaTe">
  182. <div style="width: 80%;margin: 0 auto;padding-bottom: 10px">
  183. <img src="@/assets/noShipping.png" alt="" style="width: 100px;">
  184. <p style="color: #9EA3AA;">抱歉,没有符合条件的船期!</p>
  185. </div>
  186. </div>
  187. <div class="stepBarIcon" v-if="estimaTe">
  188. <div class="iconShip">
  189. <img src="@/assets/ship.png" style="height: 100%;" alt="">
  190. <img src="@/assets/ship.png" style="height: 100%;" alt="">
  191. </div>
  192. <div class="stepBarLine">
  193. <div v-for="item in 5"></div>
  194. </div>
  195. <!-- 文本地点-->
  196. <div class="stepBarText">
  197. <div>
  198. <p>{{ estimaTe.portofloadidName }}</p>
  199. <div>
  200. <p>预计开航</p>
  201. <p>{{ estimaTe.fEtd }}</p>
  202. </div>
  203. </div>
  204. <div v-if="!estimaTe.portoftransshipmentName">
  205. <p>{{ estimaTe.portoftransshipmentName }}</p>
  206. <!-- <div>
  207. <p>预计抵港</p>
  208. <p>2022-03-24</p>
  209. <p>预计开航</p>
  210. <p>2022-03-24</p>
  211. </div> -->
  212. </div>
  213. <div>
  214. <p>{{ estimaTe.distinationidName }}</p>
  215. <div>
  216. <p>预计抵港</p>
  217. <p>{{ estimaTe.fEta }}</p>
  218. </div>
  219. </div>
  220. </div>
  221. </div>
  222. </div>
  223. <!-- 收发货人信息-->
  224. <div class="feeBox" style="">
  225. <!-- 发货信息-->
  226. <div class="titleBox_receive" style="margin-right: 4px;">
  227. <div>
  228. <span class="redBlock">&nbsp;</span>
  229. <span>发货信息</span>
  230. </div>
  231. <div class="receiveInfo">
  232. <el-form-item label="发货人全称" prop="fShippername">
  233. <el-input v-model="form.fShippername" :disabled="noEditing"/>
  234. </el-form-item>
  235. <el-form-item label="发货人联系人">
  236. <el-input v-model="form.fShipperattn" :disabled="noEditing"/>
  237. </el-form-item>
  238. <el-form-item label="发货人电话">
  239. <el-input v-model="form.fShippertel" :disabled="noEditing"/>
  240. </el-form-item>
  241. </div>
  242. </div>
  243. <!-- 收货信息-->
  244. <div class="titleBox_receive" style="padding-right: 10px">
  245. <div>
  246. <span class="redBlock">&nbsp;</span>
  247. <span>收货信息</span>
  248. </div>
  249. <div class="receiveInfo">
  250. <el-form-item label="收货人全称" prop="fConsigneername">
  251. <el-input v-model="form.fConsigneername" :disabled="noEditing"/>
  252. </el-form-item>
  253. <el-form-item label="收货人联系人">
  254. <el-input v-model="form.fConsigneeattn" :disabled="noEditing"/>
  255. </el-form-item>
  256. <el-form-item label="收货人电话">
  257. <el-input v-model="form.fConsigneetel" :disabled="noEditing"/>
  258. </el-form-item>
  259. </div>
  260. </div>
  261. </div>
  262. <el-form :model="list" ref="list" :rules="rulEs" label-position="top">
  263. <!-- 货物信息-->
  264. <!-- 基本资料-->
  265. <div class="moduleStyle">
  266. <div class="titleBox">
  267. <span class="redBlock">&nbsp;</span>
  268. <span>货物信息</span>
  269. </div>
  270. <div style="display:flex;justify-content:space-around;flex-wrap: wrap;margin: 10px 20px">
  271. <div class="mainModules">
  272. <el-form-item label="货物名称" prop="fGoodsid">
  273. <el-select
  274. v-model="list.fGoodsid"
  275. filterable
  276. remote
  277. @change="select"
  278. style="width: 80%;"
  279. class="elSelect"
  280. placeholder="请输入模糊查找货物名称"
  281. :disabled="noEditing"
  282. >
  283. <el-scrollbar>
  284. <el-option
  285. v-for="(dict, index) in goods"
  286. :key="dict.fId"
  287. :label="dict.fName"
  288. :value="dict.fId"
  289. ></el-option>
  290. </el-scrollbar>
  291. </el-select>
  292. </el-form-item>
  293. </div>
  294. <div class="mainModules">
  295. <el-form-item label="货类">
  296. <el-input style="width:80%;" v-model="typeGoods" :disabled="noEditing"/>
  297. </el-form-item>
  298. </div>
  299. <div class="mainModules">
  300. <el-form-item label="包装类型" prop="fPackageid">
  301. <el-select style="width:80%;" placeholder="请选择"
  302. v-model="list.fPackageid" :disabled="noEditing">
  303. <el-option
  304. v-for="(dict, index) in packing"
  305. :key="dict.dictValue"
  306. :label="dict.dictLabel"
  307. :value="dict.dictValue"
  308. ></el-option>
  309. </el-select>
  310. </el-form-item>
  311. </div>
  312. <div class="mainModules">
  313. <el-form-item label="箱型" prop="fCntrid">
  314. <el-select style="width:80%;" placeholder="请选择"
  315. v-model="list.fCntrid" @change="seleEt" :disabled="noEditing">
  316. <el-option
  317. v-for="(dict, index) in container"
  318. :key="dict.fId"
  319. :label="dict.fNo"
  320. :value="dict.fId"
  321. ></el-option>
  322. </el-select>
  323. </el-form-item>
  324. </div>
  325. <div class="mainModules">
  326. <el-form-item label="箱量" prop="fCntrcount">
  327. <el-input style="width:80%;" :disabled="noEditing" v-model.number="list.fCntrcount" placeholder="请输入箱量" :maxlength="3" @input="calculation" oninput='this.value=this.value.replace(/[^\d.]/g,"")'/>
  328. </el-form-item>
  329. </div>
  330. <div class="mainModules">
  331. <el-form-item label="单箱重量(吨)" prop="fCntrweight">
  332. <el-input style="width:80%;" :disabled="noEditing" v-model="list.fCntrweight" @input="cntrWeight"/>
  333. </el-form-item>
  334. </div>
  335. <div class="mainModules">
  336. <el-form-item label="箱态" prop="fCntrstatus">
  337. <el-select style="width:80%;" placeholder="请选择"
  338. v-model="list.fCntrstatus" :disabled="noEditing">
  339. <el-option
  340. v-for="(dict, index) in fStatus"
  341. :key="dict.dictValue"
  342. :label="dict.dictLabel"
  343. :value="dict.dictValue"
  344. ></el-option>
  345. </el-select>
  346. </el-form-item>
  347. </div>
  348. <div class="mainModules">
  349. <el-form-item label="自备货柜" prop="fSoc">
  350. <el-select style="width:80%;" placeholder="请选择"
  351. v-model="list.fSoc" :disabled="noEditing">
  352. <el-option label="是" value="0"></el-option>
  353. <el-option label="否" value="1"></el-option>
  354. </el-select>
  355. </el-form-item>
  356. </div>
  357. <div class="mainModules" v-if="whether === true">
  358. <el-form-item label="设置温度(℃)">
  359. <el-input style="width:80%;" :disabled="noEditing" v-model="list.fTemperature" @input="temperature" oninput='this.value=this.value.replace(/[^\-?\d.]/g,"")'/>
  360. </el-form-item>
  361. </div>
  362. <div class="mainModules" v-if="whether === true">
  363. <el-form-item label="风门开度(%)">
  364. <el-input style="width:80%;" :disabled="noEditing" v-model.number="list.fDraught" @input="throttleOpening" oninput='this.value=this.value.replace(/[^\d.]/g,"")'/>
  365. </el-form-item>
  366. </div>
  367. <div class="mainModules" v-if="whether === true">
  368. <el-form-item label="湿度设置(%)">
  369. <el-input style="width:80%;" :disabled="noEditing" v-model="list.fHumidity" @input="throttleOpening" oninput='this.value=this.value.replace(/[^\d.]/g,"")'/>
  370. </el-form-item>
  371. </div>
  372. <div class="mainModules" v-if="whether === true">
  373. <el-form-item label="预冷要求">
  374. <el-select style="width:80%;" v-model="list.fPrecooling" :disabled="noEditing" placeholder="请选择">
  375. <el-option label="是" value="1"></el-option>
  376. <el-option label="否" value="2"></el-option>
  377. </el-select>
  378. </el-form-item>
  379. </div>
  380. <div class="mainModules">
  381. <el-form-item label="危险化学品" prop="fIfdanger">
  382. <el-select style="width:80%;" placeholder="请选择"
  383. v-model="list.fIfdanger" :disabled="noEditing">
  384. <el-option
  385. v-for="(dict, index) in dangerous"
  386. :key="dict.dictValue"
  387. :label="dict.dictLabel"
  388. :value="dict.dictValue"
  389. ></el-option>
  390. </el-select>
  391. <el-button type="text" style="display: inline; color: red" :disabled="noEditing">
  392. <i class="el-icon-upload el-icon--right"></i>
  393. </el-button>
  394. </el-form-item>
  395. </div>
  396. <div style="width: 72%;height: 100px;text-align: left;">
  397. <el-form-item label="备注" prop="remarks">
  398. <el-input style="width:80%;" placeholder="如有特殊需求,请再此说明" v-model="list.remarks" :disabled="noEditing"/>
  399. </el-form-item>
  400. </div>
  401. </div>
  402. </div>
  403. </el-form>
  404. <!-- 费用信息-->
  405. <div class="moduleStyle">
  406. <div class="titleBox">
  407. <span class="redBlock">&nbsp;</span>
  408. <span>费用信息</span>
  409. </div>
  410. <div class="basicData" style="display:flex;justify-content: flex-start">
  411. <div class="mainModules">
  412. <el-form-item label="是否办理保险" prop="fInsurance">
  413. <el-select style="width:80%;" placeholder="请选择"
  414. v-model="form.fInsurance" :disabled="noEditing">
  415. <el-option
  416. v-for="(dict, index) in insurance"
  417. :key="dict.dictValue"
  418. :label="dict.dictLabel"
  419. :value="dict.dictValue"
  420. ></el-option>
  421. </el-select>
  422. </el-form-item>
  423. </div>
  424. <div class="mainModules">
  425. <el-form-item label="保险货值(万元)" prop="fInsuranceamt">
  426. <el-input style="width:80%;" v-model="form.fInsuranceamt" :disabled="list.fInsurance == '2' ||noEditing"/>
  427. </el-form-item>
  428. </div>
  429. </div>
  430. </div>
  431. </el-form>
  432. <!-- 箱信息-->
  433. <div class="moduleStyle" v-if="boxInformation">
  434. <div class="titleBox">
  435. <span class="redBlock">&nbsp;</span>
  436. <span>箱信息</span>
  437. <el-button type="primary" size="mini" style="float: right;margin-right: 20px" @click="newlyAdded" :disabled="noDditing">新行
  438. </el-button>
  439. </div>
  440. <div class="basicData" style="display:flex;justify-content: flex-start">
  441. <el-table
  442. :data="tableData"
  443. style="width: 100%">
  444. <el-table-column
  445. prop="fCntrno"
  446. align="center"
  447. width="155"
  448. label="箱号">
  449. <template slot-scope="scope">
  450. <el-input v-model="scope.row.fCntrno" placeholder="请输入箱号" :disabled="noDditing"></el-input>
  451. </template>
  452. </el-table-column>
  453. <el-table-column
  454. prop="fSealno"
  455. align="center"
  456. width="135"
  457. label="铅封号">
  458. <template slot-scope="scope">
  459. <el-input v-model="scope.row.fSealno" placeholder="请输入铅封号" :disabled="noDditing"></el-input>
  460. </template>
  461. </el-table-column>
  462. <el-table-column
  463. prop="fCntrweight"
  464. align="center"
  465. width="80"
  466. label="单箱(吨)">
  467. <template slot-scope="scope">
  468. <el-input v-model="scope.row.fCntrweight" placeholder="请输入" :disabled="noDditing" @input="cntrWeighTt(scope.row.fCntrweight,scope.row)"></el-input>
  469. </template>
  470. </el-table-column>
  471. <el-table-column
  472. prop="fGoodsid"
  473. align="center"
  474. width="110"
  475. label="货名">
  476. <template slot-scope="scope">
  477. <!-- <el-input v-model="scope.row.fGoodsid" placeholder="请输入货名"></el-input>-->
  478. <el-select
  479. v-model="scope.row.fGoodsid"
  480. :disabled="noDditing"
  481. filterable
  482. remote
  483. @change="select"
  484. class="elSelect"
  485. placeholder="请输入"
  486. >
  487. <el-scrollbar>
  488. <el-option
  489. v-for="(dict, index) in goods"
  490. :key="dict.fId"
  491. :label="dict.fName"
  492. :value="dict.fId"
  493. ></el-option>
  494. </el-scrollbar>
  495. </el-select>
  496. </template>
  497. </el-table-column>
  498. <el-table-column
  499. prop="fPackageid"
  500. align="center"
  501. width="100"
  502. label="包装类型">
  503. <template slot-scope="scope">
  504. <!-- <el-input v-model="scope.row.fGoodsid" placeholder="请输入货名"></el-input>-->
  505. <el-select slot="prepend" placeholder="请选" v-model="scope.row.fPackageid" :disabled="noDditing">
  506. <el-option
  507. v-for="(dict, index) in packing"
  508. :key="dict.dictValue"
  509. :label="dict.dictLabel"
  510. :value="dict.dictValue"
  511. ></el-option>
  512. </el-select>
  513. </template>
  514. </el-table-column>
  515. <el-table-column
  516. prop="fCntrid"
  517. align="center"
  518. width="105"
  519. label="箱型">
  520. <template slot-scope="scope">
  521. <!-- <el-input v-model="scope.row.fGoodsid" placeholder="请输入货名"></el-input>-->
  522. <el-select slot="prepend" placeholder="请选择" v-model="scope.row.fCntrid" :disabled="noDditing">
  523. <el-option
  524. v-for="(dict, index) in container"
  525. :key="dict.fId"
  526. :label="dict.fNo"
  527. :value="dict.fId"
  528. ></el-option>
  529. </el-select>
  530. </template>
  531. </el-table-column>
  532. <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
  533. <template slot-scope="scope">
  534. <el-button
  535. size="mini"
  536. type="text"
  537. icon="el-icon-delete"
  538. :disabled="noDditing"
  539. @click.native.prevent="deleteRow(scope.$index, tableData)"
  540. >删除
  541. </el-button>
  542. </template>
  543. </el-table-column>
  544. </el-table>
  545. </div>
  546. </div>
  547. </div>
  548. <!-- 右基本资料-->
  549. <div class="costCalculation">
  550. <div class="costModuleStyle" style="">
  551. <div class="titleBox">
  552. <span class="redBlock">&nbsp;</span>
  553. <span>费用计算</span>
  554. </div>
  555. <div class="mainBox">
  556. <p>
  557. <span>箱型</span>
  558. <span v-if="boxType">{{boxType}}</span>
  559. <span v-else>---</span>
  560. </p>
  561. <p>
  562. <span>箱量</span>
  563. <span>¥{{cntrcount}}</span>
  564. </p>
  565. </div>
  566. <div class="mainBox" style="border-bottom: 1px solid #E8E8E8">
  567. <p>
  568. <span>海运服务费</span>
  569. <span>¥0</span>
  570. </p>
  571. <p>
  572. <span>代理进口杂费合计</span>
  573. <span>¥0</span>
  574. </p>
  575. <p>
  576. <span>代理出口杂费合计</span>
  577. <span>¥0</span>
  578. </p>
  579. <p>
  580. <span>THC代收</span>
  581. <span>¥0</span>
  582. </p>
  583. <p>
  584. <span>燃油附加费</span>
  585. <span>¥0</span>
  586. </p>
  587. </div>
  588. <div class="mainBox" style="border-bottom: none">
  589. <p>
  590. <span>保险费</span>
  591. <span>¥{{ form.fInsuranceamt }}</span>
  592. </p>
  593. </div>
  594. </div>
  595. <div class="confirmOrder" @click="confirmOrder" v-if="boxStatus">
  596. 确认下单
  597. </div>
  598. <div class="confirmOrder" @click="submit" v-else v-show="!noDditing">
  599. 提交箱信息
  600. </div>
  601. </div>
  602. <el-dialog
  603. title="请选择船期"
  604. :visible.sync="dialogVisible"
  605. :close-on-press-escape="false"
  606. :close-on-click-modal="false"
  607. append-to-body
  608. width="80%"
  609. style="text-align: left"
  610. :before-close="handleClose">
  611. <el-table
  612. :data="estimated"
  613. style="width: 100%"
  614. :header-cell-style="{textAlign: 'center'}"
  615. :cell-style="{ textAlign: 'center' }">
  616. <el-table-column
  617. prop="fEta"
  618. label="预计开航">
  619. </el-table-column>
  620. <el-table-column
  621. prop="fEtd"
  622. label="预计抵港">
  623. </el-table-column>
  624. <el-table-column
  625. prop="fCutoffdate"
  626. label="截港日期">
  627. </el-table-column>
  628. <el-table-column
  629. prop="pidName"
  630. label="船名航次">
  631. <template slot-scope="scope">
  632. {{scope.row.pidName}}&nbsp;&nbsp;&nbsp;{{scope.row.fNo}}
  633. </template>
  634. </el-table-column>
  635. <el-table-column
  636. prop="twenty"
  637. label="20GP">
  638. </el-table-column>
  639. <el-table-column
  640. prop="fortyHc"
  641. label="40HC">
  642. </el-table-column>
  643. <el-table-column
  644. prop="fortyRh"
  645. label="40RH">
  646. </el-table-column>
  647. <el-table-column
  648. label="操作">
  649. <template slot-scope="scope">
  650. <el-button type="primary" @click="booking(scope.row)">订舱</el-button>
  651. </template>
  652. </el-table-column>
  653. </el-table>
  654. </el-dialog>
  655. </div>
  656. </template>
  657. <script>
  658. import { request } from '../../request/request';
  659. export default {
  660. name: 'contractPlacing',
  661. data() {
  662. return {
  663. boxType:'',
  664. cntrcount:0,
  665. noEditing:false,
  666. noDditing:false,
  667. rules: {
  668. fLoadportid: [{ required: true, message: " ", trigger: "blur" }],
  669. fDestportid: [{ required: true, message: " ", trigger: "blur" }],
  670. fBsdate: [{ required: true, message: " ", trigger: "blur" }],
  671. fServiceitems: [{ required: true, message: " ", trigger: "blur" }],
  672. fPaymode: [{ required: true, message: " ", trigger: "blur" }],
  673. fInvoceobj: [{ required: true, message: " ", trigger: "blur" }],
  674. fLaneid: [{ required: true, message: " ", trigger: "blur" }],
  675. fSign: [{ required: true, message: " ", trigger: "blur" }],
  676. fDetentioncargo: [{ required: true, message: " ", trigger: "blur" }],
  677. fShippername: [{ required: true, message: " ", trigger: "blur" }],
  678. fShipperattn: [{ required: true, message: " ", trigger: "blur" }],
  679. fShippertel: [{ required: true, message: " ", trigger: "blur" }],
  680. fConsigneername: [{ required: true, message: " ", trigger: "blur" }],
  681. fConsigneeattn: [{ required: true, message: " ", trigger: "blur" }],
  682. fConsigneetel: [{ required: true, message: " ", trigger: "blur" }],
  683. fInsurance: [{ required: true, message: " ", trigger: "blur" }],
  684. fInsuranceamt: [{ required: true, message: " ", trigger: "blur" }],
  685. },
  686. rulEs:{
  687. fGoodsid: [{ required: true, message: " ", trigger: "blur" }],
  688. fPackageid: [{ required: true, message: " ", trigger: "blur" }],
  689. fCntrid: [{ required: true, message: " ", trigger: "blur" }],
  690. fCntrcount: [{ required: true, message: " ", trigger: "blur" }],
  691. fCntrweight: [{ required: true, message: " ", trigger: "blur" }],
  692. fCntrstatus: [{ required: true, message: " ", trigger: "blur" }],
  693. fSoc: [{ required: true, message: " ", trigger: "blur" }],
  694. fIfdanger: [{ required: true, message: " ", trigger: "blur" }],
  695. },
  696. fMblnoOptions: [],
  697. paymentMethod: [],
  698. estimated: [],
  699. goods: [],
  700. dialogVisible: false,
  701. transport: [],
  702. insurance: [],
  703. drawee: [],
  704. packing: [],
  705. rouTe: [],
  706. boxInformation: false,
  707. tableData: [],
  708. container: [],
  709. form: {
  710. fInsuranceamt:0,
  711. fInsurance:'1'
  712. },
  713. etentioncargo:[],
  714. estimaTe: '',
  715. list: {},
  716. typeGoods: '',
  717. whether: false,
  718. dangerous: [],
  719. boxStatus: true,
  720. fStatus:[],
  721. cEsign:[]
  722. };
  723. },
  724. created() {
  725. this.dictionary('f_paymode');
  726. this.dictionary('f_invoceobj');
  727. this.dictionary('f_insurance');
  728. this.dictionary('f_serviceitems');
  729. this.dictionary('f_packageid');
  730. this.dictionary('f_ifdanger');
  731. this.dictionary('f_updateEF');
  732. this.dictionary('f_sign');
  733. this.dictionary('f_detentioncargo');
  734. this.handleQuery();
  735. this.queryGoods();
  736. this.queryContainer();
  737. this.routeGood();
  738. if (this.$route.query.data) {
  739. this.detailsInquiry(this.$route.query.data);
  740. this.boxInformation = true;
  741. this.boxStatus = false;
  742. }else if (this.$route.query.res){
  743. let data = JSON.parse(this.$route.query.res)
  744. this.$set(this.form, "fBsdate", data.fEtd);
  745. this.$set(this.form, "fLoadportid", data.fPortofloadid);
  746. this.$set(this.form, "fDestportid", data.fDistinationid);
  747. this.estimatedTime()
  748. }
  749. },
  750. methods: {
  751. cntrWeighTt(res,row){
  752. console.log(res);
  753. if (res <= 40 && res >= 0){
  754. return
  755. }else if( res == '' || res == null){
  756. return;
  757. } else {
  758. row.fCntrweight = ''
  759. this.$message({
  760. showClose: true,
  761. message: '单箱重量应在0-40吨之间',
  762. type: 'error',
  763. offset:90
  764. });
  765. }
  766. },
  767. cntrWeight(res){
  768. if (res <= 40 && res >= 0){
  769. return
  770. }else if( res == '' || res == null){
  771. return;
  772. } else {
  773. this.list.fCntrweight = ''
  774. this.$message({
  775. showClose: true,
  776. message: '单箱重量应在0-40吨之间',
  777. type: 'error',
  778. offset:90
  779. });
  780. }
  781. },
  782. temperature(res){
  783. console.log(res);
  784. if (res < 20 && res > -30){
  785. }else if(res == '-'){
  786. }else {
  787. this.list.fTemperature = ''
  788. this.$message({
  789. showClose: true,
  790. message: '冷藏箱温度为-30℃至20℃之间的整数',
  791. type: 'error',
  792. offset:90
  793. });
  794. }
  795. },
  796. throttleOpening(res){
  797. if (res <= 100){
  798. }else {
  799. this.list.fDraught = ''
  800. this.$message({
  801. showClose: true,
  802. message: '不能大于100%或小于0%',
  803. type: 'error',
  804. offset:90
  805. });
  806. }
  807. },
  808. newlyAdded() {
  809. console.log(this.tableData);
  810. this.tableData.push({
  811. fCntrno: '',
  812. fSealno: '',
  813. fCntrweight: this.list.fCntrweight,
  814. fGoodsid: this.list.fGoodsid,
  815. fPackageid:this.list.fPackageid,
  816. fCntrid:this.list.fCntrid
  817. });
  818. },
  819. deleteRow(index, rows) {
  820. rows.splice(index, 1);
  821. },
  822. detailsInquiry(fId) {
  823. request({
  824. url: '/khwarehouse/warehousebills/webVersionOrder',
  825. method: 'post',
  826. data: {
  827. fId: fId
  828. }
  829. })
  830. .then(res => {
  831. console.log(res.data.rows[0]);
  832. this.form = res.data.rows[0];
  833. // || this.form.fBillstatus >= 3
  834. if (this.form.fBillstatus >= 9){
  835. this.noDditing = true
  836. }
  837. if (this.form.fBillstatus >= 3){
  838. this.noEditing = true
  839. }
  840. this.form.fPaymode = this.form.fPaymode +''
  841. this.form.fSign = this.form.fSign +''
  842. this.form.fDetentioncargo = this.form.fDetentioncargo +''
  843. this.estimaTe = res.data.rows[0].tVoyageL;
  844. this.list = res.data.rows[0].tWarehousebillsCntrList[0];
  845. this.typeGoods = res.data.rows[0].tWarehousebillsCntrList[0].typeidName;
  846. if (res.data.rows[0].tWarehousebillsCntritemsList){
  847. this.tableData = res.data.rows[0].tWarehousebillsCntritemsList
  848. }
  849. })
  850. .catch(err => {
  851. console.log(err);
  852. });
  853. },
  854. routeGood() {
  855. request({
  856. url: '/shipping/address/selectAirLineName',
  857. method: 'get',
  858. })
  859. .then(res => {
  860. console.log(res);
  861. this.rouTe = res.data.rows;
  862. })
  863. .catch(err => {
  864. console.log(err);
  865. });
  866. },
  867. booking(res) {
  868. if (res) {
  869. this.estimaTe = res;
  870. this.form.fVoyid = this.estimaTe.fId;
  871. this.form.fVslid = this.estimaTe.fPid;
  872. this.dialogVisible = false
  873. }
  874. },
  875. submit() {
  876. console.log(this.tableData);
  877. for (let item in this.tableData){
  878. if (!this.tableData[item].fCntrno){
  879. this.$confirm('箱号未填写是否继续提交?').then(_ => {
  880. this.submission()
  881. }).catch(_ => {});
  882. }else if (!this.tableData[item].fSealno){
  883. this.$confirm('铅封号未填写是否继续提交?').then(_ => {
  884. this.submission()
  885. }).catch(_ => {});
  886. }else {
  887. this.submission()
  888. }
  889. }
  890. },
  891. submission(){
  892. let formData = new window.FormData();
  893. formData.append('tWarehousebills', JSON.stringify({ fId:this.form.fId }));
  894. formData.append('tWarehousebillsCntritems', JSON.stringify(this.tableData));
  895. request({
  896. url: '/khwarehouse/warehousebills/submitMakingMessage',
  897. method: 'post',
  898. data: formData
  899. }).then(res => {
  900. // console.log(res);
  901. if (res.data.code === 500){
  902. // console.log(res.data.msg);
  903. // this.$message.error(res.data.msg);
  904. }else {
  905. this.goods = res.data.data;
  906. this.$router.push({
  907. path: '/',
  908. });
  909. }
  910. }).catch(err => {
  911. // console.log(err);
  912. this.$message.error(err);
  913. });
  914. },
  915. queryGoods() {
  916. request({
  917. url: '/khwarehouse/warehousebills/getGoodName',
  918. method: 'post',
  919. })
  920. .then(res => {
  921. console.log(res);
  922. this.goods = res.data.data;
  923. })
  924. .catch(err => {
  925. this.$message.error('未知错误');
  926. });
  927. },
  928. calculation(){
  929. for (let item in this.container){
  930. if (this.container[item].fId == this.list.fCntrid){
  931. request({
  932. url: '/shipping/items/containerPrice/',
  933. method: 'post',
  934. data:{
  935. cntridName:this.container[item].fNo,
  936. fPortofloadid:this.form.fLoadportid,
  937. fDistinationid:this.form.fDestportid,
  938. fEtd:this.form.fBsdate
  939. }
  940. }).then(res => {
  941. console.log(res);
  942. let number = Number(res.data.data[0]) * Number(this.list.fCntrcount)
  943. if (number){
  944. this.cntrcount = number
  945. }else {
  946. this.cntrcount = 0
  947. }
  948. }).catch(err => {
  949. console.log(err);
  950. });
  951. }
  952. }
  953. },
  954. queryContainer() {
  955. request({
  956. url: '/shipping/cntr/selectRcntrName',
  957. method: 'get',
  958. }).then(res => {
  959. // console.log(res);
  960. this.container = res.data.rows;
  961. })
  962. .catch(err => {
  963. console.log(err);
  964. });
  965. },
  966. handleQuery() {
  967. request({
  968. url: '/shipping/address/selectPortName',
  969. method: 'get',
  970. params: {
  971. fName: this.form.fLoadportid
  972. }
  973. })
  974. .then(res => {
  975. // console.log(res);
  976. this.fMblnoOptions = res.data.rows;
  977. // console.log(this.fMblnoOptions);
  978. })
  979. .catch(err => {
  980. console.log(err);
  981. });
  982. },
  983. estimatedTime() {
  984. // console.log(this.form.fLoadportid, this.form.fDestportid);
  985. if (this.form.fLoadportid && this.form.fDestportid) {
  986. request({
  987. url: 'shipping/voyage/selectMessage',
  988. method: 'post',
  989. data: {
  990. fPortofloadid: this.form.fLoadportid,
  991. fDistinationid: this.form.fDestportid
  992. }
  993. }).then(res => {
  994. let data = res.data.rows;
  995. if (data.length !== 0) {
  996. this.estimated = data;
  997. this.estimaTe = data[0];
  998. this.form.fVoyid = this.estimaTe.fId;
  999. this.form.fVslid = this.estimaTe.fPid;
  1000. }
  1001. }).catch(err => {
  1002. console.log(err);
  1003. });
  1004. }
  1005. },
  1006. dictionary(dictType) {
  1007. request({
  1008. url: '/system/dict/data/type/' + dictType,
  1009. method: 'get',
  1010. })
  1011. .then(res => {
  1012. // console.log(res);
  1013. switch (dictType) {
  1014. case 'f_paymode':
  1015. this.paymentMethod = res.data.data;
  1016. break;
  1017. case 'f_invoceobj':
  1018. this.drawee = res.data.data;
  1019. break;
  1020. case 'f_insurance':
  1021. this.insurance = res.data.data;
  1022. break;
  1023. case 'f_serviceitems':
  1024. this.transport = res.data.data;
  1025. if (this.$route.query.where == '4'){
  1026. for (let item in this.transport){
  1027. if (this.transport[item].dictLabel == 'CY-CY'){
  1028. this.$set(this.form, 'fServiceitems', this.transport[item].dictValue)
  1029. }
  1030. }
  1031. }
  1032. break;
  1033. case 'f_packageid':
  1034. this.packing = res.data.data;
  1035. break;
  1036. case 'f_ifdanger':
  1037. this.dangerous = res.data.data;
  1038. break;
  1039. case 'f_updateEF':
  1040. this.fStatus = res.data.data;
  1041. break;
  1042. case 'f_sign':
  1043. this.cEsign = res.data.data;
  1044. break;
  1045. case 'f_detentioncargo':
  1046. this.etentioncargo = res.data.data;
  1047. break;
  1048. default:
  1049. break;
  1050. }
  1051. })
  1052. .catch(err => {
  1053. console.log(err);
  1054. });
  1055. },
  1056. confirmOrder() {
  1057. this.$refs["form"].validate((valid) => {
  1058. if (valid) {
  1059. console.log(valid);
  1060. this.$refs["list"].validate((valid) => {
  1061. if (valid) {
  1062. let formData = new window.FormData();
  1063. formData.append('tWarehousebills', JSON.stringify(this.form));
  1064. formData.append('tWarehousebillsCntr', JSON.stringify([this.list]));
  1065. request({
  1066. url: '/khwarehouse/warehousebills/submitPlantMessage',
  1067. method: 'post',
  1068. data: formData
  1069. })
  1070. .then(res => {
  1071. if (res.data.code === 200){
  1072. this.$message.success(res.data.msg);
  1073. this.$router.push({
  1074. path: '/',
  1075. });
  1076. }
  1077. console.log(res);
  1078. })
  1079. .catch(err => {
  1080. console.log(err);
  1081. });
  1082. } else {
  1083. console.log('error submit!!');
  1084. return false;
  1085. }
  1086. });
  1087. } else {
  1088. console.log('error submit!!');
  1089. return false;
  1090. }
  1091. });
  1092. },
  1093. handleClose() {
  1094. this.dialogVisible = false
  1095. },
  1096. select(id) {
  1097. for (let item in this.goods) {
  1098. if (this.goods[item].fId === id) {
  1099. this.typeGoods = this.goods[item].typeName;
  1100. }
  1101. }
  1102. },
  1103. seleEt(id) {
  1104. console.log(id);
  1105. // boxType
  1106. console.log(this.container);
  1107. for (let item in this.container) {
  1108. if (this.container[item].fId === id) {
  1109. this.boxType = this.container[item].fNo
  1110. this.calculation()
  1111. if (this.container[item].fType === 2){
  1112. this.whether = true;
  1113. return
  1114. }else {
  1115. this.whether = false;
  1116. return
  1117. }
  1118. }
  1119. }
  1120. }
  1121. }
  1122. };
  1123. </script>
  1124. <style scoped lang="scss">
  1125. .el-select{
  1126. > > > .el-input__inner {
  1127. border: none;
  1128. border-bottom: 1px solid #ccc;
  1129. border-radius: 0;
  1130. }
  1131. }
  1132. .el-input {
  1133. /deep/ .el-input__inner {
  1134. border: none;
  1135. border-bottom: 1px solid #ccc;
  1136. border-radius: 0;
  1137. }
  1138. }
  1139. .mainModules > > > .el-input__inner {
  1140. border: none;
  1141. border-bottom: 1px solid #ccc;
  1142. border-radius: 0;
  1143. }
  1144. .moduleStyle {
  1145. background: #FFFFFF;
  1146. box-shadow: 0px 4px 13px 0px rgba(200, 200, 200, 0.33);
  1147. width: 75%;
  1148. margin-bottom: 10px;
  1149. }
  1150. .titleBox {
  1151. padding-left: 30px;
  1152. width: 100%;
  1153. text-align: left;
  1154. padding: 10px;
  1155. font-size: 20px
  1156. }
  1157. .feeBox {
  1158. display: flex;
  1159. justify-content: space-between;
  1160. width: 75%;
  1161. margin-bottom: 10px;
  1162. }
  1163. .titleBox_receive {
  1164. padding-left: 30px;
  1165. width: 50%;
  1166. text-align: left;
  1167. padding: 12px;
  1168. font-size: 20px;
  1169. background: #FFFFFF;
  1170. box-shadow: 0px 4px 13px 0px rgba(200, 200, 200, 0.44);
  1171. }
  1172. .redBlock {
  1173. display: inline-block;
  1174. background-color: red;
  1175. width: 5px;
  1176. margin-right: 10px
  1177. }
  1178. .basicData {
  1179. display: flex;
  1180. justify-content: space-around;
  1181. flex-wrap: wrap;
  1182. margin: 10px 20px
  1183. }
  1184. .mainModules {
  1185. width: 24%;
  1186. height: 100px;
  1187. text-align: left;
  1188. }
  1189. .mainModules > span {
  1190. margin-left: 20px;
  1191. color: #A3A7AD;
  1192. }
  1193. .stepBarIcon {
  1194. margin: 10px;
  1195. padding: 20px 0 40px 0;
  1196. display: flex;
  1197. flex-direction: column;
  1198. align-items: center
  1199. }
  1200. .iconShip {
  1201. width: 35%;
  1202. display: flex;
  1203. justify-content: space-between
  1204. }
  1205. .iconShip {
  1206. img {
  1207. width: 20px
  1208. }
  1209. }
  1210. .stepBarLine {
  1211. width: 80%;
  1212. display: flex;
  1213. align-items: center;
  1214. }
  1215. .stepBarLine {
  1216. div:nth-child(odd) {
  1217. background-color: red;
  1218. width: 8px;
  1219. height: 8px;
  1220. border-radius: 50%;
  1221. display: inline-block
  1222. }
  1223. div:nth-child(even) {
  1224. width: 50%;
  1225. height: 2px;
  1226. background-color: red;
  1227. display: inline-block;
  1228. }
  1229. }
  1230. .stepBarText {
  1231. display: flex;
  1232. justify-content: space-between;
  1233. width: 90%;
  1234. div {
  1235. div {
  1236. color: #848484;
  1237. display: flex;
  1238. flex-direction: column;
  1239. align-items: center;
  1240. p:nth-child(odd) {
  1241. width: 70px;
  1242. margin: 0
  1243. }
  1244. p:nth-child(even) {
  1245. margin: 0
  1246. }
  1247. }
  1248. }
  1249. }
  1250. .receiveInfo {
  1251. margin: 30px auto;
  1252. }
  1253. .el-form-item>>>.el-form-item__label{
  1254. padding: 0px;
  1255. }
  1256. .costCalculation {
  1257. width: 25%;
  1258. position: fixed;
  1259. right: 4%;
  1260. .costModuleStyle {
  1261. background: #FFFFFF;
  1262. box-shadow: 0px 4px 13px 0px rgba(200, 200, 200, 0.44);
  1263. }
  1264. .titleBox {
  1265. .redBlock {
  1266. display: inline-block;
  1267. background-color: red;
  1268. width: 5px;
  1269. margin-right: 10px
  1270. }
  1271. }
  1272. .mainBox {
  1273. padding: 10px;
  1274. margin: 0 20px 0 20px;
  1275. border-bottom: 1px dashed #E8E8E8;
  1276. color: #71757A;
  1277. p {
  1278. display: flex;
  1279. justify-content: space-between;
  1280. span:nth-child(even) {
  1281. color: #000;
  1282. }
  1283. }
  1284. }
  1285. }
  1286. .confirmOrder {
  1287. background: red;
  1288. height: 70px;
  1289. margin-top: 20px;
  1290. text-align: center;
  1291. line-height: 70px;
  1292. color: white;
  1293. font-size: 20px;
  1294. }
  1295. .confirmOrder:hover {
  1296. cursor: pointer;
  1297. }
  1298. </style>
  1299. <style>
  1300. .el-form-item.is-error .el-input__inner, .el-form-item.is-error .el-input__inner:focus, .el-form-item.is-error .el-textarea__inner, .el-form-item.is-error .el-textarea__inner:focus, .el-message-box__input input.invalid, .el-message-box__input input.invalid:focus {
  1301. border-color: #F56C6C;
  1302. }
  1303. </style>