create.blade.php 115 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875
  1. @extends('layouts.app')
  2. @section('title')录入-退货管理@endsection
  3. @section('content')
  4. <div class="container-fluid d-none" id="editPanel">
  5. <<<<<<< HEAD
  6. <div class="card mb-2">
  7. <div style="position: relative" v-if="status.lockingBillPanel">
  8. <div style="background-color: #aaa; height: 535px; opacity: 0.5;
  9. width:100%;z-index: 9; position: absolute" class="d-flex ">
  10. </div>
  11. <div style="height: 550px;
  12. width:100%;z-index: 10; position: absolute" class="d-flex align-items-center ">
  13. <button class="btn btn-info flex-fill" @click="cancelPackCommitEdit">取消锁定</button>
  14. </div>
  15. </div>
  16. <div class="row">
  17. <div class="col-7">
  18. <div class="card-body">
  19. <div class="list-group" style="max-height: 477px;overflow-y: scroll">
  20. <table class="table table-sm table-striped table-info table-hover table-bordered">
  21. <tr>
  22. <th>创建时间</th>
  23. <th>客户名称</th>
  24. <th>退回单号</th>
  25. <th>退回公司</th>
  26. <th>姓名</th>
  27. <th>电话</th>
  28. <th>到付费用</th>
  29. <th>订单号</th>
  30. <th>原单号</th>
  31. <th>是否入库</th>
  32. {{-- <th>备注</th>--}}
  33. <th>操作</th>
  34. </tr>
  35. <tr :class="[rejectedBill.isEditing?'bg-info':'']"
  36. v-for="rejectedBill in rejectedBills" :data-id="rejectedBill.id" @click="editBill">
  37. <td>@{{rejectedBill.created_at | dateNoYear}}</td>
  38. <td>@{{rejectedBill.owner_name }}</td>
  39. <td>@{{rejectedBill.logistic_number_return }}</td>
  40. <td>@{{rejectedBill.logistic_name}}</td>
  41. <td>@{{rejectedBill.sender}}</td>
  42. <td>@{{rejectedBill.mobile_sender}}</td>
  43. <td>@{{rejectedBill.fee_collected}}</td>
  44. <td>@{{rejectedBill.order_number}}</td>
  45. <td>@{{rejectedBill.logistic_number}}</td>
  46. <td>@{{rejectedBill.is_loaded|isLoaded}}</td>
  47. {{-- <td>@{{rejectedBill.remark}}</td>--}}
  48. @can('退货管理-删除')
  49. <td>
  50. <button class="btn btn-sm btn-outline-danger"
  51. @click.stop="deleteBill(rejectedBill)">删
  52. </button>
  53. </td>@endcan
  54. </tr>
  55. </table>
  56. </div>
  57. </div>
  58. </div>
  59. <div class="col-5 disabled">
  60. <div class="card-body ml-n4">
  61. <table class="table table-striped table-sm table-bordered"
  62. :class="[status.billEditing?'bg-info':'']">
  63. <tr>
  64. <td>
  65. <div class="form-group mb-0">
  66. <label for="id_owner" class="col-form-label text-right">客户名称</label>
  67. <div class="input-group">
  68. <select name="id_owner" id="id_owner" class="form-control"
  69. :class="[errors.id_owner?'is-invalid':'']"
  70. v-model="billInputting.id_owner" required data-focusOrder="1">
  71. <option value=""></option>
  72. <option v-for="owner in owners" :value="owner.id">@{{ owner.name }}
  73. </option>
  74. </select>
  75. <input type="text" class="form-control input-group-prepend"
  76. placeholder="输入关键字定位客户名称"
  77. name="locateOwnerSearch" autocomplete="off" @input="locateIdOwner"
  78. v-model="billInputting.locateOwnerSearch">
  79. <span class="invalid-feedback" v-if="errors.id_owner"><strong>@{{ errors.id_owner[0] }}</strong></span>
  80. </div>
  81. </div>
  82. </td>
  83. <td>
  84. <div class="form-group mb-0">
  85. <label for="sender" class="col-form-label text-right">姓名</label>
  86. <input type="text" class="form-control" :class="[errors.sender?'is-invalid':'']"
  87. data-focusOrder="5"
  88. name="sender" id="sender" autocomplete="off"
  89. v-model="billInputting.sender">
  90. <span class="invalid-feedback" v-if="errors.sender"><strong>@{{errors.sender[0] }}</strong></span>
  91. </div>
  92. </td>
  93. </tr>
  94. <tr>
  95. <td>
  96. <div class="form-group mb-0">
  97. <label for="logistic_number_return"
  98. class="col-form-label text-right">退回单号</label>
  99. <input type="text" class="form-control"
  100. :class="[errors.logistic_number_return?'is-invalid':'']"
  101. data-focusOrder="2"
  102. name="logistic_number_return" id="logistic_number_return"
  103. autocomplete="off" v-model="billInputting.logistic_number_return"
  104. @change="logistic_number_returnChange"
  105. required>
  106. <span class="invalid-feedback" v-if="errors.logistic_number_return"><strong>@{{errors.logistic_number_return[0] }}</strong></span>
  107. </div>
  108. </td>
  109. <td>
  110. <div class="form-group mb-0">
  111. <label for="fee_collected" class="col-form-label text-right">到付费用</label>
  112. <input type="text" class="form-control"
  113. :class="[errors.fee_collected?'is-invalid':'']"
  114. data-focusOrder=""
  115. v-model="billInputting.fee_collected" name="fee_collected"
  116. id="fee_collected" autocomplete="off">
  117. <span class="invalid-feedback" v-if="errors.fee_collected"><strong>@{{errors.fee_collected[0] }}</strong></span>
  118. </div>
  119. </td>
  120. </tr>
  121. <tr>
  122. <td>
  123. <div class="form-group mb-0">
  124. <label for="id_logistic_return" class="col-form-label text-right">退回公司</label>
  125. <div class="input-group">
  126. <select name="id_logistic_return" id="id_logistic_return"
  127. class="form-control"
  128. data-focusOrder="3"
  129. :class="[errors.id_logistic_return?'is-invalid':'']"
  130. v-model="billInputting.id_logistic_return" required>
  131. <option value=""></option>
  132. <option v-for="logistic in logistics" :value="logistic.id">
  133. @{{logistic.name}}
  134. </option>
  135. </select>
  136. <input type="text" class="form-control input-group-prepend"
  137. placeholder="输入关键字定位物流公司"
  138. name="locateLogisticSearch" autocomplete="off"
  139. @input="locateLogistic" v-model="billInputting.locateLogisticSearch">
  140. <span class="invalid-feedback" v-if="errors.id_logistic_return"><strong>@{{errors.id_logistic_return[0] }}</strong></span>
  141. </div>
  142. </div>
  143. </td>
  144. <td>
  145. <div class="form-group mb-0">
  146. <label for="order_number" class="col-form-label text-right">订单号</label>
  147. <input type="text" class="form-control"
  148. :class="[errors.order_number?'is-invalid':'']"
  149. data-focusOrder="6"
  150. name="order_number" id="order_number" autocomplete="off"
  151. v-model="billInputting.order_number">
  152. <span class="invalid-feedback" v-if="errors.order_number"><strong>@{{ errors.order_number[0] }}</strong></span>
  153. </div>
  154. </td>
  155. </tr>
  156. <tr>
  157. <td>
  158. <div class="form-group mb-0">
  159. <label for="mobile_sender" class="col-form-label text-right">电话</label>
  160. <input type="text" class="form-control"
  161. :class="[errors.mobile_sender?'is-invalid':'']"
  162. data-focusOrder="4"
  163. name="mobile_sender" id="mobile_sender" autocomplete="off"
  164. v-model="billInputting.mobile_sender" required>
  165. <span class="invalid-feedback" v-if="errors.mobile_sender"><strong>@{{ errors.mobile_sender[0] }}</strong></span>
  166. </div>
  167. </td>
  168. <td>
  169. <div class="form-group mb-0">
  170. <label for="logistic_number" class="col-form-label text-right">原单号</label>
  171. <button class="btn btn-outline-primary btn-sm"
  172. @click="billInputting.logistic_number='原单退回'"
  173. style="transform: scale(0.9)">原单退回
  174. </button>
  175. <input type="text" class="form-control"
  176. :class="[errors.logistic_number?'is-invalid':'']"
  177. data-focusOrder="7"
  178. name="logistic_number" id="logistic_number" autocomplete="off"
  179. v-model="billInputting.logistic_number"
  180. >
  181. <span class="invalid-feedback" v-if="errors.logistic_number"><strong>@{{errors.logistic_number[0] }}</strong></span>
  182. </div>
  183. </td>
  184. </tr>
  185. <tr>
  186. <td>
  187. <div class="form-group mb-0">
  188. <label for="bill_remark" class="col-form-label text-right">备注</label>
  189. <input type="text" class="form-control"
  190. :class="[errors.bill_remark?'is-invalid':'']"
  191. data-focusOrder="9"
  192. name="remark" id="bill_remark" autocomplete="off"
  193. v-model="billInputting.remark" required>
  194. <span class="invalid-feedback" v-if="errors.bill_remark"><strong>@{{ errors.remark[0] }}</strong></span>
  195. </div>
  196. </td>
  197. <td>
  198. <div class="form-group mb-0">
  199. <label for="is_loaded" class="col-form-label text-right">是否入库</label>
  200. <div v-if="status.isLoadSign" class="text-danger">系统标计为入库</div>
  201. <select name="is_loaded" id="is_loaded" class="form-control"
  202. :class="[errors.is_loaded?'is-invalid':'']"
  203. data-focusOrder="8" :disabled="status.lockingIsLoadedInput"
  204. v-model="billInputting.is_loaded" required>
  205. <option value="0">否</option>
  206. <option value="1">是</option>
  207. <option value="null">无需入库</option>
  208. <option value="3">上传异常</option>
  209. </select>
  210. <span class="invalid-feedback" v-if="errors.is_loaded"><strong>@{{errors.is_loaded[0]}}</strong></span>
  211. </div>
  212. </td>
  213. </tr>
  214. <tr v-if="billInputting.id_owner==='94'">
  215. <td>
  216. <div class="form-group mb-0">
  217. <label for="common_01" class="col-form-label text-right">寄件方省</label>
  218. <input type="text" class="form-control"
  219. :class="[errors.common_01?'is-invalid':'']"
  220. data-focusOrder="10"
  221. name="common_01" id="common_01" autocomplete="off"
  222. v-model="billInputting.common_01" required>
  223. <span class="invalid-feedback" v-if="errors.common_01"><strong>@{{ errors.common_01[0] }}</strong></span>
  224. </div>
  225. </td>
  226. <td>
  227. <div class="form-group mb-0">
  228. <label for="common_02" class="col-form-label text-right">重量</label>
  229. <input type="text" class="form-control"
  230. :class="[errors.common_02?'is-invalid':'']"
  231. data-focusOrder="11"
  232. name="common_02" id="common_02" autocomplete="off"
  233. v-model="billInputting.common_02" required>
  234. <span class="invalid-feedback" v-if="errors.common_02"><strong>@{{ errors.common_02[0] }}</strong></span>
  235. </div>
  236. </td>
  237. </tr>
  238. <tr>
  239. <td>
  240. <div class="form-group mb-0 align-items-center row">
  241. <div class="col-2" v-if="status.billEditing">
  242. <button class="btn btn-success btn-sm tooltipOn" @click="shiftToCreate"
  243. title="点击取消编辑,进入新增状态">取消
  244. </button>
  245. </div>
  246. <div class="col-8" :class="[status.billCreating?'offset-2':'']">
  247. <input v-if="status.billCreating" type="button"
  248. class="btn btn-success form-control" value="提交新条目"
  249. @click="commitHeader">
  250. <input v-if="status.billEditing" type="button"
  251. class="btn btn-dark form-control" value="修改"
  252. @click="commitEditHeader">
  253. </div>
  254. </div>
  255. </td>
  256. <td>
  257. </td>
  258. </tr>
  259. </table>
  260. </div>
  261. </div>
  262. </div>
  263. </div>
  264. =======
  265. <h3 class="text-danger text-center">暂停使用</h3>
  266. {{-- <div class="card mb-2">--}}
  267. {{-- <div style="position: relative" v-if="status.lockingBillPanel">--}}
  268. {{-- <div style="background-color: #aaa; height: 535px; opacity: 0.5;--}}
  269. {{-- width:100%;z-index: 9; position: absolute" class="d-flex ">--}}
  270. {{-- </div>--}}
  271. {{-- <div style="height: 550px;--}}
  272. {{-- width:100%;z-index: 10; position: absolute" class="d-flex align-items-center ">--}}
  273. {{-- <button class="btn btn-info flex-fill" @click="cancelPackCommitEdit">取消锁定</button>--}}
  274. {{-- </div>--}}
  275. {{-- </div>--}}
  276. {{-- <div class="row">--}}
  277. {{-- <div class="col-7">--}}
  278. {{-- <div class="card-body">--}}
  279. {{-- <div class="list-group" style="max-height: 477px;overflow-y: scroll">--}}
  280. {{-- <table class="table table-sm table-striped table-info table-hover table-bordered">--}}
  281. {{-- <tr>--}}
  282. {{-- <th>创建时间</th>--}}
  283. {{-- <th>客户名称</th>--}}
  284. {{-- <th>退回单号</th>--}}
  285. {{-- <th>退回公司</th>--}}
  286. {{-- <th>姓名</th>--}}
  287. {{-- <th>电话</th>--}}
  288. {{-- <th>到付费用</th>--}}
  289. {{-- <th>订单号</th>--}}
  290. {{-- <th>原单号</th>--}}
  291. {{-- <th>是否入库</th>--}}
  292. {{-- --}}{{-- <th>备注</th>--}}
  293. {{-- <th>操作</th>--}}
  294. {{-- </tr>--}}
  295. {{-- <tr :class="[rejectedBill.isEditing?'bg-info':'']"--}}
  296. {{-- v-for="rejectedBill in rejectedBills" :data-id="rejectedBill.id" @click="editBill">--}}
  297. {{-- <td>@{{rejectedBill.created_at | dateNoYear}}</td>--}}
  298. {{-- <td>@{{rejectedBill.owner_name }}</td>--}}
  299. {{-- <td>@{{rejectedBill.logistic_number_return }}</td>--}}
  300. {{-- <td>@{{rejectedBill.logistic_name}}</td>--}}
  301. {{-- <td>@{{rejectedBill.sender}}</td>--}}
  302. {{-- <td>@{{rejectedBill.mobile_sender}}</td>--}}
  303. {{-- <td>@{{rejectedBill.fee_collected}}</td>--}}
  304. {{-- <td>@{{rejectedBill.order_number}}</td>--}}
  305. {{-- <td>@{{rejectedBill.logistic_number}}</td>--}}
  306. {{-- <td>@{{rejectedBill.is_loaded|isLoaded}}</td>--}}
  307. {{-- --}}{{-- <td>@{{rejectedBill.remark}}</td>--}}
  308. {{-- @can('退货管理-删除')--}}
  309. {{-- <td>--}}
  310. {{-- <button class="btn btn-sm btn-outline-danger"--}}
  311. {{-- @click.stop="deleteBill(rejectedBill)">删--}}
  312. {{-- </button>--}}
  313. {{-- </td>@endcan--}}
  314. {{-- </tr>--}}
  315. {{-- </table>--}}
  316. {{-- </div>--}}
  317. {{-- </div>--}}
  318. {{-- </div>--}}
  319. {{-- <div class="col-5 disabled">--}}
  320. {{-- <div class="card-body ml-n4">--}}
  321. {{-- <table class="table table-striped table-sm table-bordered"--}}
  322. {{-- :class="[status.billEditing?'bg-info':'']">--}}
  323. {{-- <tr>--}}
  324. {{-- <td>--}}
  325. {{-- <div class="form-group mb-0">--}}
  326. {{-- <label for="id_owner" class="col-form-label text-right">客户名称</label>--}}
  327. {{-- <div class="input-group">--}}
  328. {{-- <select name="id_owner" id="id_owner" class="form-control"--}}
  329. {{-- :class="[errors.id_owner?'is-invalid':'']"--}}
  330. {{-- v-model="billInputting.id_owner" required data-focusOrder="1">--}}
  331. {{-- <option value=""></option>--}}
  332. {{-- <option v-for="owner in owners" :value="owner.id">@{{ owner.name }}--}}
  333. {{-- </option>--}}
  334. {{-- </select>--}}
  335. {{-- <input type="text" class="form-control input-group-prepend"--}}
  336. {{-- placeholder="输入关键字定位客户名称"--}}
  337. {{-- name="locateOwnerSearch" autocomplete="off" @input="locateIdOwner"--}}
  338. {{-- v-model="billInputting.locateOwnerSearch">--}}
  339. {{-- <span class="invalid-feedback" v-if="errors.id_owner"><strong>@{{ errors.id_owner[0] }}</strong></span>--}}
  340. {{-- </div>--}}
  341. {{-- </div>--}}
  342. {{-- </td>--}}
  343. {{-- <td>--}}
  344. {{-- <div class="form-group mb-0">--}}
  345. {{-- <label for="sender" class="col-form-label text-right">姓名</label>--}}
  346. {{-- <input type="text" class="form-control" :class="[errors.sender?'is-invalid':'']"--}}
  347. {{-- data-focusOrder="5"--}}
  348. {{-- name="sender" id="sender" autocomplete="off"--}}
  349. {{-- v-model="billInputting.sender">--}}
  350. {{-- <span class="invalid-feedback" v-if="errors.sender"><strong>@{{errors.sender[0] }}</strong></span>--}}
  351. {{-- </div>--}}
  352. {{-- </td>--}}
  353. {{-- </tr>--}}
  354. {{-- <tr>--}}
  355. {{-- <td>--}}
  356. {{-- <div class="form-group mb-0">--}}
  357. {{-- <label for="logistic_number_return"--}}
  358. {{-- class="col-form-label text-right">退回单号</label>--}}
  359. {{-- <input type="text" class="form-control"--}}
  360. {{-- :class="[errors.logistic_number_return?'is-invalid':'']"--}}
  361. {{-- data-focusOrder="2"--}}
  362. {{-- name="logistic_number_return" id="logistic_number_return"--}}
  363. {{-- autocomplete="off" v-model="billInputting.logistic_number_return"--}}
  364. {{-- @change="logistic_number_returnChange"--}}
  365. {{-- required>--}}
  366. {{-- <span class="invalid-feedback" v-if="errors.logistic_number_return"><strong>@{{errors.logistic_number_return[0] }}</strong></span>--}}
  367. {{-- </div>--}}
  368. {{-- </td>--}}
  369. {{-- <td>--}}
  370. {{-- <div class="form-group mb-0">--}}
  371. {{-- <label for="fee_collected" class="col-form-label text-right">到付费用</label>--}}
  372. {{-- <input type="text" class="form-control"--}}
  373. {{-- :class="[errors.fee_collected?'is-invalid':'']"--}}
  374. {{-- data-focusOrder=""--}}
  375. {{-- v-model="billInputting.fee_collected" name="fee_collected"--}}
  376. {{-- id="fee_collected" autocomplete="off">--}}
  377. {{-- <span class="invalid-feedback" v-if="errors.fee_collected"><strong>@{{errors.fee_collected[0] }}</strong></span>--}}
  378. {{-- </div>--}}
  379. {{-- </td>--}}
  380. {{-- </tr>--}}
  381. {{-- <tr>--}}
  382. {{-- <td>--}}
  383. {{-- <div class="form-group mb-0">--}}
  384. {{-- <label for="id_logistic_return" class="col-form-label text-right">退回公司</label>--}}
  385. {{-- <div class="input-group">--}}
  386. {{-- <select name="id_logistic_return" id="id_logistic_return"--}}
  387. {{-- class="form-control"--}}
  388. {{-- data-focusOrder="3"--}}
  389. {{-- :class="[errors.id_logistic_return?'is-invalid':'']"--}}
  390. {{-- v-model="billInputting.id_logistic_return" required>--}}
  391. {{-- <option value=""></option>--}}
  392. {{-- <option v-for="logistic in logistics" :value="logistic.id">--}}
  393. {{-- @{{logistic.name}}--}}
  394. {{-- </option>--}}
  395. {{-- </select>--}}
  396. {{-- <input type="text" class="form-control input-group-prepend"--}}
  397. {{-- placeholder="输入关键字定位物流公司"--}}
  398. {{-- name="locateLogisticSearch" autocomplete="off"--}}
  399. {{-- @input="locateLogistic" v-model="billInputting.locateLogisticSearch">--}}
  400. {{-- <span class="invalid-feedback" v-if="errors.id_logistic_return"><strong>@{{errors.id_logistic_return[0] }}</strong></span>--}}
  401. {{-- </div>--}}
  402. {{-- </div>--}}
  403. {{-- </td>--}}
  404. {{-- <td>--}}
  405. {{-- <div class="form-group mb-0">--}}
  406. {{-- <label for="order_number" class="col-form-label text-right">订单号</label>--}}
  407. {{-- <input type="text" class="form-control"--}}
  408. {{-- :class="[errors.order_number?'is-invalid':'']"--}}
  409. {{-- data-focusOrder="6"--}}
  410. {{-- name="order_number" id="order_number" autocomplete="off"--}}
  411. {{-- v-model="billInputting.order_number">--}}
  412. {{-- <span class="invalid-feedback" v-if="errors.order_number"><strong>@{{ errors.order_number[0] }}</strong></span>--}}
  413. {{-- </div>--}}
  414. {{-- </td>--}}
  415. {{-- </tr>--}}
  416. {{-- <tr>--}}
  417. {{-- <td>--}}
  418. {{-- <div class="form-group mb-0">--}}
  419. {{-- <label for="mobile_sender" class="col-form-label text-right">电话</label>--}}
  420. {{-- <input type="text" class="form-control"--}}
  421. {{-- :class="[errors.mobile_sender?'is-invalid':'']"--}}
  422. {{-- data-focusOrder="4"--}}
  423. {{-- name="mobile_sender" id="mobile_sender" autocomplete="off"--}}
  424. {{-- v-model="billInputting.mobile_sender" required>--}}
  425. {{-- <span class="invalid-feedback" v-if="errors.mobile_sender"><strong>@{{ errors.mobile_sender[0] }}</strong></span>--}}
  426. {{-- </div>--}}
  427. {{-- </td>--}}
  428. {{-- <td>--}}
  429. {{-- <div class="form-group mb-0">--}}
  430. {{-- <label for="logistic_number" class="col-form-label text-right">原单号</label>--}}
  431. {{-- <button class="btn btn-outline-primary btn-sm"--}}
  432. {{-- @click="billInputting.logistic_number='原单退回'"--}}
  433. {{-- style="transform: scale(0.9)">原单退回--}}
  434. {{-- </button>--}}
  435. {{-- <input type="text" class="form-control"--}}
  436. {{-- :class="[errors.logistic_number?'is-invalid':'']"--}}
  437. {{-- data-focusOrder="7"--}}
  438. {{-- name="logistic_number" id="logistic_number" autocomplete="off"--}}
  439. {{-- v-model="billInputting.logistic_number"--}}
  440. {{-- >--}}
  441. {{-- <span class="invalid-feedback" v-if="errors.logistic_number"><strong>@{{errors.logistic_number[0] }}</strong></span>--}}
  442. {{-- </div>--}}
  443. {{-- </td>--}}
  444. {{-- </tr>--}}
  445. {{-- <tr>--}}
  446. {{-- <td>--}}
  447. {{-- <div class="form-group mb-0">--}}
  448. {{-- <label for="bill_remark" class="col-form-label text-right">备注</label>--}}
  449. {{-- <input type="text" class="form-control"--}}
  450. {{-- :class="[errors.bill_remark?'is-invalid':'']"--}}
  451. {{-- data-focusOrder="9"--}}
  452. {{-- name="remark" id="bill_remark" autocomplete="off"--}}
  453. {{-- v-model="billInputting.remark" required>--}}
  454. {{-- <span class="invalid-feedback" v-if="errors.bill_remark"><strong>@{{ errors.remark[0] }}</strong></span>--}}
  455. {{-- </div>--}}
  456. {{-- </td>--}}
  457. {{-- <td>--}}
  458. {{-- <div class="form-group mb-0">--}}
  459. {{-- <label for="is_loaded" class="col-form-label text-right">是否入库</label>--}}
  460. {{-- <div v-if="status.isLoadSign" class="text-danger">系统标计为入库</div>--}}
  461. {{-- <select name="is_loaded" id="is_loaded" class="form-control"--}}
  462. {{-- :class="[errors.is_loaded?'is-invalid':'']"--}}
  463. {{-- data-focusOrder="8" :disabled="status.lockingIsLoadedInput"--}}
  464. {{-- v-model="billInputting.is_loaded" required>--}}
  465. {{-- <option value="0">否</option>--}}
  466. {{-- <option value="1">是</option>--}}
  467. {{-- <option value="null">无需入库</option>--}}
  468. {{-- <option value="3">上传异常</option>--}}
  469. {{-- </select>--}}
  470. {{-- <span class="invalid-feedback" v-if="errors.is_loaded"><strong>@{{errors.is_loaded[0]}}</strong></span>--}}
  471. {{-- </div>--}}
  472. {{-- </td>--}}
  473. {{-- </tr>--}}
  474. {{-- <tr v-if="billInputting.id_owner==='94'">--}}
  475. {{-- <td>--}}
  476. {{-- <div class="form-group mb-0">--}}
  477. {{-- <label for="common_01" class="col-form-label text-right">寄件方省</label>--}}
  478. {{-- <input type="text" class="form-control"--}}
  479. {{-- :class="[errors.common_01?'is-invalid':'']"--}}
  480. {{-- data-focusOrder="10"--}}
  481. {{-- name="common_01" id="common_01" autocomplete="off"--}}
  482. {{-- v-model="billInputting.common_01" required>--}}
  483. {{-- <span class="invalid-feedback" v-if="errors.common_01"><strong>@{{ errors.common_01[0] }}</strong></span>--}}
  484. {{-- </div>--}}
  485. {{-- </td>--}}
  486. {{-- <td>--}}
  487. {{-- <div class="form-group mb-0">--}}
  488. {{-- <label for="common_02" class="col-form-label text-right">重量</label>--}}
  489. {{-- <input type="text" class="form-control"--}}
  490. {{-- :class="[errors.common_02?'is-invalid':'']"--}}
  491. {{-- data-focusOrder="11"--}}
  492. {{-- name="common_02" id="common_02" autocomplete="off"--}}
  493. {{-- v-model="billInputting.common_02" required>--}}
  494. {{-- <span class="invalid-feedback" v-if="errors.common_02"><strong>@{{ errors.common_02[0] }}</strong></span>--}}
  495. {{-- </div>--}}
  496. {{-- </td>--}}
  497. {{-- </tr>--}}
  498. {{-- <tr>--}}
  499. {{-- <td>--}}
  500. {{-- <div class="form-group mb-0 align-items-center row">--}}
  501. {{-- <div class="col-2" v-if="status.billEditing">--}}
  502. {{-- <button class="btn btn-success btn-sm tooltipOn" @click="shiftToCreate"--}}
  503. {{-- title="点击取消编辑,进入新增状态">取消--}}
  504. {{-- </button>--}}
  505. {{-- </div>--}}
  506. {{-- <div class="col-8" :class="[status.billCreating?'offset-2':'']">--}}
  507. {{-- <input v-if="status.billCreating" type="button"--}}
  508. {{-- class="btn btn-success form-control" value="提交新条目"--}}
  509. {{-- @click="commitHeader">--}}
  510. {{-- <input v-if="status.billEditing" type="button"--}}
  511. {{-- class="btn btn-dark form-control" value="修改"--}}
  512. {{-- @click="commitEditHeader">--}}
  513. {{-- </div>--}}
  514. {{-- </div>--}}
  515. {{-- </td>--}}
  516. {{-- <td>--}}
  517. {{-- </td>--}}
  518. {{-- </tr>--}}
  519. {{-- </table>--}}
  520. {{-- </div>--}}
  521. {{-- </div>--}}
  522. {{-- </div>--}}
  523. {{-- </div>--}}
  524. >>>>>>> b0347ca84d8eeedd9c1ac88b1c55b77c6a0613e8
  525. <div class="card" v-if="status.editingBill">
  526. <div class="row">
  527. <div class="col-7">
  528. <div class="card-body">
  529. <div class="list-group">
  530. <table class="table table-sm table-striped table-warning table-hover table-bordered">
  531. <tr>
  532. <th class="text-center">序号</th>
  533. <th class="text-center">商品条码</th>
  534. <th class="text-center">商品名称</th>
  535. <th class="text-center">数量</th>
  536. <th class="text-center">是否正品</th>
  537. <th class="text-center">生产日期</th>
  538. <th class="text-center">效期</th>
  539. <th class="text-center">批次号</th>
  540. <th class="text-center">备注</th>
  541. <th class="text-center">外箱图</th>
  542. <th class="text-center">产品图</th>
  543. <th class="text-center">照片</th>
  544. @can('退货管理-删除')
  545. <th class="text-center">操作</th>@endcan
  546. </tr>
  547. <tr :class="[item.isEditing?'bg-warning':'']"
  548. v-for="(item,i) in items" :data-id="item.id" @click="editItem">
  549. <td>@{{i+1}}</td>
  550. <td>@{{item.barcode_goods }}</td>
  551. <td>@{{item.name_goods }}</td>
  552. <td>@{{item.amount}}</td>
  553. <td>@{{item.quality_label}}</td>
  554. <td>@{{item.made_at}}</td>
  555. <td>@{{item.validity_at}}</td>
  556. <td>@{{item.batch_number}}</td>
  557. <td>@{{item.remark}}</td>
  558. <td>
  559. <div align="center" @mouseleave="removeCommonImg('common_img_package'+item.id)" @mouseenter="commonImg('img_package'+item.id,item.package_images)">
  560. <div>
  561. <input class="btn btn-sm btn-outline-secondary" type="button" @click="certiimg(item.id,'外箱')" value="上传图片 "/>
  562. <input multiple type="file" @change="submitImages($event,i)" :id="item.id"
  563. style="display: none" accept="image/gif,image/jpeg,image/jpg,image/png,image/svg"/>
  564. </div>
  565. <div :id="'img_package'+item.id">
  566. <img v-for="uploadFile in item.package_images" :src="imgPrefix+uploadFile.url+'-thumbnail.'+uploadFile.type">
  567. </div>
  568. </div>
  569. </td>
  570. <td>
  571. <div align="center" @mouseleave="removeCommonImg('common_img_commodity'+item.id)" @mouseenter="commonImg('img_commodity'+item.id,item.commodity_images)">
  572. <div>
  573. <input class="btn btn-sm btn-outline-secondary" type="button" @click="certiimg(item.id,'产品')" value="上传图片 "/>
  574. <input multiple type="file" @change="submitImages($event,i)" :id="item.id"
  575. style="display: none" accept="image/gif,image/jpeg,image/jpg,image/png,image/svg"/>
  576. </div>
  577. <div :id="'img_commodity'+item.id">
  578. <img v-for="uploadFile in item.commodity_images" :src="imgPrefix+uploadFile.url+'-thumbnail.'+uploadFile.type">
  579. </div>
  580. </div>
  581. </td>
  582. <td>
  583. <div align="center" @mouseleave="removeCommonImg('common_img_'+item.id)" @mouseenter="commonImg('img_'+item.id,item.upload_files)">
  584. <button class="btn btn-outline-secondary btn-sm" @click="takePhoto(item.id,i)">拍照上传</button>
  585. <div :id="'img_'+item.id">
  586. <img v-for="uploadFile in item.upload_files" :src="imgPrefix+uploadFile.url+'-thumbnail.'+uploadFile.type">
  587. </div>
  588. </div>
  589. </td>
  590. <td class="text-center">
  591. <button class="btn btn-outline-success btn-sm" @click="enableCamera(true);">开启摄像头</button>
  592. @can('退货管理-删除')<button class="btn btn-outline-danger btn-sm" @click="deleteItem">删</button>@endcan
  593. </td>
  594. </tr>
  595. </table>
  596. </div>
  597. </div>
  598. </div>
  599. <div class="col-5">
  600. <div class="card-body ml-n4">
  601. <table class="table table-striped table-sm table-bordered"
  602. :class="[status.itemEditing?'bg-warning':'']">
  603. <tr>
  604. <td>
  605. <div class="form-group mb-0">
  606. <label for="barcode_goods" class="col-form-label text-right">商品条码</label>
  607. <input type="text" class="form-control"
  608. :class="[errors.barcode_goods?'is-invalid':'']"
  609. data-focusOrder="11"
  610. name="barcode_goods" id="barcode_goods" autocomplete="off"
  611. v-model="itemInputting.barcode_goods"
  612. @change="barcode_goodsChange"
  613. >
  614. <span class="invalid-feedback" v-if="errors.barcode_goods"><strong>@{{errors.barcode_goods[0] }}</strong></span>
  615. </div>
  616. </td>
  617. <td>
  618. <div class="form-group mb-0">
  619. <label for="name_goods" class="col-form-label text-right">商品名称</label>
  620. <input type="text" class="form-control"
  621. :class="[errors.name_goods?'is-invalid':'']"
  622. data-focusOrder="14"
  623. name="name_goods" id="name_goods" autocomplete="off"
  624. v-model="itemInputting.name_goods"
  625. @change="name_goodsChange"
  626. >
  627. <span class="invalid-feedback" v-if="errors.name_goods"><strong>@{{errors.name_goods[0] }}</strong></span>
  628. </div>
  629. </td>
  630. </tr>
  631. <tr>
  632. <td>
  633. <div class="form-group mb-0">
  634. <label for="amount" class="col-form-label text-right">数量</label>
  635. <input type="" class="form-control" :class="[errors.amount?'is-invalid':'']"
  636. data-focusOrder="12"
  637. name="amount" id="amount" autocomplete="off"
  638. v-model="itemInputting.amount" required>
  639. <span class="invalid-feedback" v-if="errors.amount"><strong>@{{errors.amount[0] }}</strong></span>
  640. </div>
  641. </td>
  642. <td>
  643. <div class="form-group mb-0">
  644. <label for="qualityLabel.name" class="col-form-label text-right">是否正品</label>
  645. <div class="form-control" :class="[errors.id_quality_label?'is-invalid':'']">
  646. <span><input id="id_quality_label_space" type="radio"
  647. name="id_quality_label"
  648. data-focusOrder="13" required="required" checked><label
  649. for="id_quality_label_space">留空</label>&nbsp;</span>
  650. <span v-for="qualityLabel in qualityLabels">
  651. <input type="radio" name="id_quality_label" :value="qualityLabel.id"
  652. data-focusOrder="13"
  653. :id="'id_quality_label_'+qualityLabel.id"
  654. v-model="itemInputting.id_quality_label" required><label
  655. for="'id_quality_label_'+qualityLabel.id">@{{qualityLabel.name}}</label>&nbsp;</span>
  656. </div>
  657. <span class="invalid-feedback" v-if="errors.id_quality_label"><strong>@{{errors.id_quality_label[0] }}</strong></span>
  658. </div>
  659. </td>
  660. </tr>
  661. <tr>
  662. <td>
  663. <div class="form-group mb-0">
  664. <label for="made_at" class="col-form-label text-right">生产日期</label>
  665. <input type="date" class="form-control"
  666. :class="[errors.made_at?'is-invalid':'']"
  667. data-focusOrder="16"
  668. name="made_at" id="made_at" autocomplete="off"
  669. v-model="itemInputting.made_at">
  670. <span class="invalid-feedback" v-if="errors.made_at"><strong>@{{errors.made_at[0] }}</strong></span>
  671. </div>
  672. </td>
  673. <td>
  674. <div class="form-group mb-0">
  675. <label for="validity_at" class="col-form-label text-right">效期</label>
  676. <input type="date" class="form-control"
  677. :class="[errors.validity_at?'is-invalid':'']"
  678. data-focusOrder="17"
  679. name="validity_at" id="validity_at" autocomplete="off"
  680. v-model="itemInputting.validity_at">
  681. <span class="invalid-feedback" v-if="errors.validity_at"><strong>@{{errors.validity_at[0] }}</strong></span>
  682. </div>
  683. </td>
  684. </tr>
  685. <tr>
  686. <td>
  687. <div class="form-group mb-0">
  688. <label for="batch_number" class="col-form-label text-right">批次号</label>
  689. <input type="text" class="form-control"
  690. :class="[errors.batch_number?'is-invalid':'']"
  691. data-focusOrder="15"
  692. name="batch_number" id="batch_number" autocomplete="off"
  693. v-model="itemInputting.batch_number"
  694. >
  695. <span class="invalid-feedback" v-if="errors.batch_number"><strong>@{{errors.batch_number[0] }}</strong></span>
  696. </div>
  697. </td>
  698. <td>
  699. <div class="form-group mb-0">
  700. <label for="remark" class="col-form-label text-right">备注</label>
  701. <input type="text" class="form-control" :class="[errors.remark?'is-invalid':'']"
  702. data-focusOrder="15"
  703. name="remark" id="remark" autocomplete="off"
  704. v-model="itemInputting.remark">
  705. <span class="invalid-feedback" v-if="errors.remark"><strong>@{{errors.remark[0] }}</strong></span>
  706. </div>
  707. </td>
  708. </tr>
  709. <tr v-if="!status.itemEditing">
  710. <td>
  711. <div class="form-group mb-0">
  712. <label for="package-image" class="col-form-label text-right">外箱图</label>
  713. <div class="border border-secondary h-auto" id="package-image" style="min-height: 65px"
  714. contenteditable="true"
  715. @paste="pasteImage($event,itemInputting.packageImages)">
  716. <div v-for="(image,i) in itemInputting.packageImages"
  717. class="d-inline-block col-4 position-relative card">
  718. <div class="card-body">
  719. <img :src="image.src" class="card-img-top" :alt="image.file.name">
  720. <div class="float-right position-relative" >
  721. <button type="button" class="btn btn-sm btn-outline-danger"
  722. @click="spliceImage(i,itemInputting.packageImages)">取消
  723. </button>
  724. </div>
  725. </div>
  726. </div>
  727. </div>
  728. </div>
  729. </td>
  730. <td>
  731. <div class="form-group mb-0">
  732. <label for="commodity-image" class="col-form-label text-right">产品图</label>
  733. <div class="border border-secondary h-auto" id="commodity-image" style="min-height: 65px"
  734. contenteditable="true"
  735. @paste="pasteImage($event,itemInputting.commodityImages)">
  736. <div v-for="(image,i) in itemInputting.commodityImages"
  737. class="d-inline-block col-4 position-relative card">
  738. <div class="card-body">
  739. <img :src="image.src" class="card-img-top" :alt="image.file.name">
  740. <div class="float-right position-relative">
  741. <button type="button" class="btn btn-sm btn-outline-danger"
  742. @click="spliceImage(i,itemInputting.commodityImages)">取消
  743. </button>
  744. </div>
  745. </div>
  746. </div>
  747. </div>
  748. </div>
  749. </td>
  750. </tr>
  751. <tr>
  752. <td>
  753. <div class="form-group mb-0 align-items-center row">
  754. <div class="col-2" v-if="status.itemEditing">
  755. <button class="btn btn-success btn-sm tooltipOn" @click="shiftToCreateItem"
  756. title="点击取消编辑,进入新增状态">取消
  757. </button>
  758. </div>
  759. <div class="col-8" :class="[status.itemCreating?'offset-2':'']">
  760. <button v-if="status.itemCreating" class="btn btn-success form-control"
  761. @click="commitItem">添加明细
  762. </button>
  763. <input v-if="status.itemEditing" type="button"
  764. class="btn btn-dark form-control" value="修改" @click="commitEditItem">
  765. </div>
  766. </div>
  767. </td>
  768. <td>
  769. </td>
  770. </tr>
  771. <tr>
  772. <td colspan="2">
  773. <div class="form-group mb-0">
  774. <div class="col-8 offset-2 mt-2 mb-2">
  775. <button class="btn btn-dark form-control" @click="endAndPackCommitEdit">
  776. 结束添加并提交
  777. </button>
  778. </div>
  779. </div>
  780. </td>
  781. </tr>
  782. </table>
  783. </div>
  784. </div>
  785. </div>
  786. </div>
  787. <div id="drag" class="col-4 p-0" style="position:fixed;bottom: 30px;left: 10px;">
  788. <div class="text-left text-success">连接摄像头拍照</div>
  789. <video id="photo" width="50%" height="auto" controls></video>
  790. <canvas id='canvas'width='400' height='300' hidden></canvas>
  791. </div>
  792. </div>
  793. @endsection
  794. @section('lastScript')
  795. <script>
  796. //鼠标拖动 drag
  797. $(function() {
  798. let posX,posY;
  799. let drag = document.getElementById("drag");
  800. drag.onmousedown = function(e) {
  801. posX = event.x - drag.offsetLeft; //获得横坐标x
  802. posY = event.y - drag.offsetTop; //获得纵坐标y
  803. document.onmousemove = mousemove; //调用函数,只要一直按着按钮就能一直调用
  804. }
  805. document.onmouseup = function() {
  806. document.onmousemove = null; //鼠标举起,停止
  807. }
  808. function mousemove(ev) {
  809. if (ev == null) ev = window.event;
  810. let left= (ev.clientX - posX);
  811. let top= (ev.clientY - posY);
  812. let pageWidth=document.body.scrollWidth;//网页正文宽度
  813. let pageHeight=window.screen.availHeight;//屏幕工作区高度
  814. //限定拖动区域
  815. if (left <0)left=0;
  816. if (left >pageWidth)left=pageWidth;
  817. if (top <0)top=0;
  818. if (top >pageHeight)top=pageHeight;
  819. drag.style.left = left + "px";
  820. drag.style.top = top + "px";
  821. }
  822. })
  823. let MediaUtils = {
  824. /**
  825. * 获取用户媒体设备(处理兼容的问题)
  826. * @param videoEnable {boolean} - 是否启用摄像头
  827. * @param audioEnable {boolean} - 是否启用麦克风
  828. * @param callback {Function} - 处理回调
  829. */
  830. getUserMedia: function (videoEnable, audioEnable, callback) {
  831. navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia
  832. || navigator.msGetUserMedia || window.getUserMedia;
  833. let constraints = {video: videoEnable, audio: audioEnable};
  834. if (navigator.mediaDevices && navigator.mediaDevices.getUserMedia) {
  835. navigator.mediaDevices.getUserMedia(constraints).then(function (stream) {
  836. callback(false, stream);
  837. })['catch'](function (err) {
  838. callback(err);
  839. });
  840. } else if (navigator.getUserMedia) {
  841. navigator.getUserMedia(constraints, function (stream) {
  842. callback(false, stream);
  843. }, function (err) {
  844. callback(err);
  845. });
  846. } else {
  847. callback(new Error('Not support userMedia'));
  848. }
  849. },
  850. /**
  851. * 关闭媒体流
  852. * @param stream {MediaStream} - 需要关闭的流
  853. */
  854. closeStream: function (stream) {
  855. if (typeof stream.stop === 'function') {
  856. stream.stop();
  857. } else {
  858. let trackList = [stream.getAudioTracks(), stream.getVideoTracks()];
  859. for (let i = 0; i < trackList.length; i++) {
  860. let tracks = trackList[i];
  861. if (tracks && tracks.length > 0) {
  862. for (let j = 0; j < tracks.length; j++) {
  863. let track = tracks[j];
  864. if (typeof track.stop === 'function') {
  865. track.stop();
  866. }
  867. }
  868. }
  869. }
  870. }
  871. }
  872. };
  873. let vueList = new Vue({
  874. el: "#editPanel",
  875. data: {
  876. imgPrefix:"{{asset("/storage")}}",
  877. // 用于存放 MediaRecorder 对象和音频Track,关闭录制和关闭媒体设备需要用到
  878. recorder:'',
  879. mediaStream:'',
  880. // 用于存放录制后的音频文件对象和录制结束回调
  881. recorderFile:'',
  882. stopRecordCallback:'',
  883. // 用于存放是否开启了视频录制
  884. videoEnabled:false,
  885. status: {
  886. billCreating: true,
  887. billEditing: false,
  888. itemCreating: true,
  889. itemEditing: false
  890. ,
  891. editingBill: null,
  892. editingBillId: '',
  893. editingItem: null,
  894. editingItemId: ''
  895. ,
  896. inputtingId_owner: '',
  897. endAndPackCommitEdited: false,
  898. lockingBillPanel: false,
  899. lockingIsLoadedInput: false,
  900. existItemsBeforeAdd: 0
  901. },
  902. itemInputting: {
  903. barcode_goods: "", name_goods: "", amount: "1", id_quality_label: "",
  904. batch_number: "", validity_at: "", remark: "", made_at: "",
  905. packageImages: [], commodityImages: [],
  906. },
  907. billInputting: {
  908. id_owner: "", mobile_sender: "", sender: "", order_number: "", remark: "",
  909. logistic_number_return: "", logistic_number: "", id_logistic_return: "",
  910. fee_collected: "", is_loaded: "0", locateLogisticSearch: "", locateOwnerSearch: "",
  911. isLoadSign: false,
  912. },
  913. errors: {
  914. id_owner: "", mobile_sender: "", sender: "", bill_remark: "",
  915. logistic_number_return: "", logistic_number: "", id_logistic_return: "",
  916. fee_collected: "", is_loaded: "",
  917. barcode_goods: "", name_goods: "", amount: "", id_quality_label: "",
  918. batch_number: "", validity_at: "", remark: "", made_at: "",
  919. },
  920. rejectedBills: {!! $rejectedBills??[] !!},
  921. submitImageType:'',
  922. items: [],
  923. owners: [
  924. @foreach($owners as $owner)
  925. {
  926. id: '{{$owner->id}}', name: '{{$owner->name}}', code: '{{$owner->code}}'
  927. },
  928. @endforeach
  929. ],
  930. logistics: [
  931. @foreach($logistics as $logistic)
  932. {
  933. id: '{{$logistic->id}}', name: '{{$logistic->name}}', code: '{{$logistic->code}}'
  934. },
  935. @endforeach
  936. ],
  937. qualityLabels: [
  938. @foreach($qualityLabels as $qualityLabel)
  939. {
  940. id: '{{$qualityLabel->id}}', name: '{{$qualityLabel->name}}'
  941. },
  942. @endforeach
  943. ],
  944. commodityOwnerId: '',
  945. },
  946. mounted: function () {
  947. let _this = this;
  948. $('#editPanel').removeClass('d-none');
  949. $('.tooltipOn').tooltip({'trigger': 'hover'});
  950. $(document).on('keypress', function (e) {
  951. if (_this.itemInputting.barcode_goods) {
  952. if (e.key === '*') {
  953. _this.commitItem();
  954. return false;
  955. }
  956. }
  957. });
  958. this.listenEnterAndJump();
  959. },
  960. methods: {
  961. logistic_number_returnChange: function (e) {
  962. let _this = this;
  963. let number = $(e.target).val();
  964. if (!number) return;
  965. let url = '{{"/apiLocal/logistic/numberFeatures/computeLogisticByNumber"}}';
  966. axios.post(url, {logistic_number_return: number}).then(function (response) {
  967. _this.cleanError();
  968. if (response.data.success === 'true') {
  969. if (response.data.logistic) {
  970. _this.billInputting.id_logistic_return = response.data.logistic.id;
  971. }
  972. }
  973. }).catch(function (response) {
  974. console.log(response);
  975. });
  976. if (_this.status.editingBill) return;
  977. let url_isUnique = '{{"/apiLocal/logistic/logisticNumberReturnIsUnique"}}';
  978. axios.post(url_isUnique, {logistic_number_return: number}).then(function (response) {
  979. _this.cleanError();
  980. if (response.data.success === 'true') {
  981. if (response.data.result === 'true') {
  982. tempTip.okWindow('该退回单号"' + number + '"已有录入其他单', '知道了')
  983. } else _this.seek_order();
  984. }
  985. }).catch(function (response) {
  986. console.log(response);
  987. });
  988. },
  989. spliceImage(i, images) {
  990. if (!confirm('是否取消选择该图片')) return;
  991. images.splice(i, 1);
  992. },
  993. getImages(images) {
  994. return images.map((item) => {
  995. return item.src;
  996. })
  997. },
  998. pasteImage(event,imageArray){
  999. for (let i = 0; i < event.clipboardData.items.length; i++) {
  1000. let item = event.clipboardData.items[i];
  1001. if (item.kind === 'string') continue;
  1002. if (item.type.indexOf('image') === -1) continue;
  1003. if (item.kind === 'file'){
  1004. let blob = item.getAsFile();
  1005. let src = null;
  1006. this.blobToBase64(blob).then(res => {
  1007. src = res;
  1008. imageArray.push({src:res,file:blob});
  1009. });
  1010. }
  1011. }
  1012. event.preventDefault();
  1013. },
  1014. blobToBase64(blob) {
  1015. return new Promise((resolve, reject) => {
  1016. const fileReader = new FileReader();
  1017. fileReader.onload = (e) => {
  1018. resolve(e.target.result);
  1019. };
  1020. fileReader.readAsDataURL(blob);
  1021. fileReader.onerror = () => {
  1022. reject(new Error('blobToBase64 error'));
  1023. };
  1024. });
  1025. },
  1026. barcode_goodsChange: function (e) {
  1027. let _this = this;
  1028. let barcode = $(e.target).val();
  1029. let url = '{{"/apiLocal/commodity/getCommodityByBarcode"}}';
  1030. axios.post(url, {
  1031. barcode: barcode,
  1032. owner_id: _this.billInputting.id_owner
  1033. }).then(function (response) {
  1034. _this.cleanError();
  1035. if (response.data.success === 'true') {
  1036. if (response.data.commodity) {
  1037. // _this.itemInputting.name_goods=response.data.name;
  1038. _this.itemInputting.name_goods = response.data.commodity.name;
  1039. _this.commodityOwnerId = response.data.commodity.owner_id;
  1040. }
  1041. } else {
  1042. tempTip.setDuration(3000);
  1043. tempTip.show('查找商品条码错误:' + response.data.fail_info)
  1044. }
  1045. }).catch(function (response) {
  1046. tempTip.setDuration(3000);
  1047. tempTip.show('未连接至商品表,检查网络');
  1048. });
  1049. },
  1050. name_goodsChange: function (e) {
  1051. let _this = this;
  1052. let name = $(e.target).val();
  1053. this.items.forEach(function (item) {
  1054. if (item.barcode_goods + '' === _this.itemInputting.barcode_goods + '') {
  1055. item.name_goods = name;
  1056. }
  1057. });
  1058. },
  1059. listenEnterAndJump: function () {
  1060. let targets = $('select,input');
  1061. targets.off('keypress');
  1062. targets.on('keypress', function (e) {
  1063. if (e.key !== "Enter") return;
  1064. let target = $(e.target);
  1065. let currentOrder = target.attr('data-focusOrder');
  1066. if (currentOrder) {
  1067. targets.each(function ($i, $val) {
  1068. let checkingTarget = $($val);
  1069. let checkingOrder = checkingTarget.attr('data-focusOrder');
  1070. if (parseInt(currentOrder) + 1 === parseInt(checkingOrder)) {
  1071. checkingTarget.focus();
  1072. }
  1073. })
  1074. }
  1075. });
  1076. targets.off('change');
  1077. targets.on('change', function (e) {
  1078. let target = $(e.target);
  1079. let currentOrder = target.attr('data-focusOrder');
  1080. if (currentOrder) {
  1081. targets.each(function ($i, $val) {
  1082. let checkingTarget = $($val);
  1083. let checkingOrder = checkingTarget.attr('data-focusOrder');
  1084. if (parseInt(currentOrder) + 1 === parseInt(checkingOrder)) {
  1085. checkingTarget.focus();
  1086. }
  1087. })
  1088. }
  1089. })
  1090. },
  1091. cleanHeader: function () {
  1092. for (let key in this.billInputting) {
  1093. this.billInputting[key] = '';
  1094. }
  1095. this.billInputting.id_owner = this.status.inputtingId_owner;
  1096. this.billInputting.is_loaded = "0";
  1097. this.billInputting.isLoadSign = false;
  1098. },
  1099. cleanItem: function () {
  1100. for (let key in this.itemInputting) {
  1101. this.itemInputting[key] = '';
  1102. }
  1103. this.itemInputting['amount'] = '1';
  1104. this.itemInputting['packageImages'] = [];
  1105. this.itemInputting['commodityImages'] = [];
  1106. },
  1107. cleanError: function () {
  1108. for (let key in this.errors) {
  1109. this.errors[key] = '';
  1110. }
  1111. },
  1112. setEditingBill: function (id) {
  1113. let _this = this;
  1114. this.status.editingBillId = id;
  1115. this.rejectedBills.forEach(function (bill) {
  1116. if (bill.id + '' === id + '') {
  1117. _this.status.editingBill = bill;
  1118. bill.isEditing = true;
  1119. } else {
  1120. bill.isEditing = false
  1121. }
  1122. });
  1123. this.$forceUpdate();
  1124. },
  1125. setEditingItem: function (id) {
  1126. let _this = this;
  1127. this.status.editingItemId = id;
  1128. this.items.forEach(function (item) {
  1129. if (item.id + '' === id + '') {
  1130. _this.status.editingItem = item;
  1131. item.isEditing = true;
  1132. } else {
  1133. item.isEditing = false
  1134. }
  1135. });
  1136. this.$forceUpdate();
  1137. },
  1138. commitHeader: function () {
  1139. let _this = this;
  1140. let url = '{{url('apiLocal/rejectedBill/store')}}';
  1141. tempTip.setDuration(99999);
  1142. tempTip.waitingTip('提交中')
  1143. axios.post(url, _this.billInputting).then(function (response) {
  1144. tempTip.cancelWaitingTip();
  1145. _this.cleanError();
  1146. if (response.data.success === 'true') {
  1147. tempTip.setDuration(1000);
  1148. tempTip.showSuccess('成功录入退单号:' + _this.billInputting.logistic_number_return);
  1149. _this.status.inputtingId_owner = _this.billInputting.id_owner;
  1150. _this.setEditingBill(response.data.id);
  1151. _this.getItemsUnderBill(response.data.id);
  1152. _this.cleanHeader();
  1153. _this.getRecentRejectedBills();
  1154. _this.lockBillPanel();
  1155. _this.status.existItemsBeforeAdd = 0;
  1156. $('#barcode_goods').focus();
  1157. } else {
  1158. if (response.data.error_fields) {
  1159. tempTip.setDuration(3000);
  1160. tempTip.show('录入失败,字段填写错误');
  1161. _this.errors = response.data.error_fields;
  1162. if (_this.errors.remark) {
  1163. _this.errors.bill_remark = _this.errors.remark;
  1164. _this.errors.remark = '';
  1165. }
  1166. } else {
  1167. tempTip.setDuration(3000);
  1168. tempTip.show('录入失败:' + response.data.fail_info)
  1169. }
  1170. }
  1171. }).catch(function (response) {
  1172. tempTip.setDuration(3000);
  1173. tempTip.show('提交失败,请重试:' + response.data.fail_info)
  1174. alert('连接错误:' + response)
  1175. });
  1176. },
  1177. commitEditItem: function () {
  1178. let _this = this;
  1179. if (!confirm("确定要提交修改吗?")) {
  1180. return;
  1181. }
  1182. let url = '{{url('apiLocal/rejectedBillItem/update')}}';
  1183. axios.post(url, _this.itemInputting).then(function (response) {
  1184. _this.cleanError();
  1185. if (response.data.success === 'true') {
  1186. tempTip.setDuration(1000);
  1187. tempTip.showSuccess('成功修改商品:' + _this.itemInputting.barcode_goods);
  1188. _this.cleanItem();
  1189. _this.getItemsUnderBill(_this.status.editingBillId);
  1190. _this.shiftToCreateItem();
  1191. } else {
  1192. if (response.data.error_fields) {
  1193. tempTip.setDuration(3000);
  1194. tempTip.show('修改失败,字段填写错误');
  1195. _this.errors = response.data.error_fields;
  1196. if (_this.errors.remark) {
  1197. _this.errors.bill_remark = _this.errors.remark;
  1198. _this.errors.remark = '';
  1199. }
  1200. } else {
  1201. tempTip.show('修改失败:' + response.data.fail_info)
  1202. }
  1203. }
  1204. }).catch(function (response) {
  1205. tempTip.setDuration(3000);
  1206. tempTip.show('提交失败,请重试:' + response.data.fail_info)
  1207. alert('连接错误:' + response)
  1208. });
  1209. },
  1210. commitEditHeader: function () {
  1211. let _this = this;
  1212. if (!confirm("确定要提交修改吗?")) {
  1213. return;
  1214. }
  1215. let url = '{{url('apiLocal/rejectedBill/update')}}';
  1216. tempTip.setDuration(99999);
  1217. tempTip.waitingTip('提交中')
  1218. axios.post(url, _this.billInputting).then(function (response) {
  1219. tempTip.cancelWaitingTip();
  1220. _this.cleanError();
  1221. if (response.data.success === 'true') {
  1222. tempTip.setDuration(1000);
  1223. tempTip.showSuccess('成功修改退单号:' + _this.billInputting.logistic_number_return);
  1224. _this.cleanHeader();
  1225. _this.getRecentRejectedBills();
  1226. _this.shiftToCreate();
  1227. } else {
  1228. if (response.data.error_fields) {
  1229. tempTip.setDuration(3000);
  1230. tempTip.show('修改失败,字段填写错误');
  1231. _this.errors = response.data.error_fields;
  1232. } else {
  1233. tempTip.show('修改失败:' + response.data.fail_info)
  1234. }
  1235. }
  1236. }).catch(function (response) {
  1237. tempTip.setDuration(3000);
  1238. tempTip.show('提交失败,请重试:' + response.data.fail_info)
  1239. alert('连接错误:' + response)
  1240. });
  1241. },
  1242. checkImageWhetherNeed(item){
  1243. if (this.billInputting.id_owner==4)return 0;//幼岚非必要上传外箱及产品图
  1244. if (item.id_quality_label!=1){
  1245. if (item.commodityImages.length===0){
  1246. tempTip.setDuration(3000);
  1247. tempTip.show('非正品,请上传外箱图及产品图!');
  1248. return 1;
  1249. }
  1250. }
  1251. return 0;
  1252. },
  1253. setFormDataImage(formData, prefix, images) {
  1254. let uuid=Math.floor(Math.random()*10000)
  1255. images.forEach((item) => {
  1256. formData.append(`${prefix}[]`, item,'rejected_bill_item'+uuid+'.jpg');
  1257. });
  1258. },
  1259. compressedImage(_this,packageImages){
  1260. let blobs=[];
  1261. packageImages.forEach(function (imageFile){
  1262. let docImg=document.createElement('img');
  1263. docImg.src=imageFile;
  1264. const { width: originWidth, height: originHeight } = docImg
  1265. let maxWidth = 400;
  1266. let maxHeight = 600;
  1267. // 需要压缩的目标尺寸
  1268. let targetWidth = originWidth
  1269. let targetHeight = originHeight
  1270. // 等比例计算超过最大限制时缩放后的图片尺寸
  1271. if (originWidth > maxWidth || originHeight > maxHeight) {
  1272. if (originWidth / originHeight > maxWidth / maxHeight) {
  1273. targetWidth = maxWidth
  1274. targetHeight = Math.floor(maxWidth * (originHeight / originWidth))
  1275. } else {
  1276. targetWidth = Math.floor(maxHeight * (originWidth / originHeight))
  1277. targetHeight = maxHeight;
  1278. }
  1279. }
  1280. const canvas = document.createElement('canvas')
  1281. const context = canvas.getContext('2d')
  1282. // 设置宽高度为等同于要压缩图片的尺寸
  1283. canvas.width = targetWidth
  1284. canvas.height = targetHeight
  1285. context.clearRect(0, 0, targetWidth, targetHeight)
  1286. //将img绘制到画布上
  1287. context.drawImage(docImg, 0, 0, targetWidth, targetHeight)
  1288. let image = canvas.toDataURL();
  1289. let blob=_this.dataUrlToBlob(image);
  1290. blobs.push(blob)
  1291. });
  1292. return blobs;
  1293. },
  1294. getDamagedFormData(item){
  1295. let _this=this;
  1296. let formData = new FormData();
  1297. if (item.packageImages.length>0){
  1298. let packageImages = _this.getImages(item.packageImages);
  1299. let blobs=_this.compressedImage(_this,packageImages);
  1300. this.setFormDataImage(formData,'packageImages',blobs);
  1301. }
  1302. if (item.commodityImages.length>0){
  1303. let commodityImages = _this.getImages(item.commodityImages);
  1304. let blobs=_this.compressedImage(_this,commodityImages);
  1305. this.setFormDataImage(formData,'commodityImages',blobs);
  1306. }
  1307. formData.append('barcode_goods',item.barcode_goods);
  1308. formData.append('amount',item.amount);
  1309. formData.append('name_goods',item.name_goods);
  1310. formData.append('id_quality_label',item.id_quality_label);
  1311. formData.append('batch_number',item.batch_number);
  1312. formData.append('validity_at',item.validity_at);
  1313. formData.append('made_at',item.made_at);
  1314. formData.append('remark',item.remark);
  1315. formData.append('id_rejected_bill',item.id_rejected_bill);
  1316. return formData;
  1317. },
  1318. commitItem: function () {
  1319. let _this = this;
  1320. if (_this.checkImageWhetherNeed(_this.itemInputting)===1)return;
  1321. let url = '{{url('apiLocal/rejectedBillItem/store')}}';
  1322. _this.itemInputting.id_rejected_bill = _this.status.editingBill.id;
  1323. if (_this.items.length < 1) {
  1324. let baoShiBuFaOwnerId = '';
  1325. _this.owners.forEach(function (owner) {
  1326. if (owner.name === '宝时补发') baoShiBuFaOwnerId = owner.id;
  1327. });
  1328. if (_this.commodityOwnerId != _this.billInputting.id_owner && _this.billInputting.id_owner != baoShiBuFaOwnerId) {
  1329. _this.isChangeOwner(_this.itemInputting.id_rejected_bill);
  1330. }
  1331. }
  1332. let formData = _this.getDamagedFormData(_this.itemInputting);
  1333. axios.post(url, formData,{'Content-Type':'multipart/form-data'}).then(function (response) {
  1334. _this.cleanError();
  1335. if (response.data.success === 'true') {
  1336. tempTip.setDuration(1000);
  1337. tempTip.showSuccess('成功录入退单商品:' + _this.itemInputting.name_goods);
  1338. _this.status.endAndPackCommitEdited = false;
  1339. _this.lockBillPanel();
  1340. _this.getItemsUnderBill(_this.status.editingBill.id);
  1341. _this.cleanItem();
  1342. $('#barcode_goods').focus();
  1343. } else {
  1344. if (response.data.error_fields) {
  1345. tempTip.setDuration(3000);
  1346. tempTip.show('录入失败,字段填写错误');
  1347. _this.errors = response.data.error_fields;
  1348. } else {
  1349. tempTip.show('录入失败:' + response.data.fail_info)
  1350. }
  1351. }
  1352. }).catch(function (response) {
  1353. tempTip.setDuration(3000);
  1354. tempTip.show('提交失败,请重试:' + response.data.fail_info)
  1355. alert('连接错误:' + response)
  1356. });
  1357. },
  1358. isChangeOwner(id_rejected_bill) {
  1359. let _this = this;
  1360. let url = '{{url('apiLocal/rejectedBillItem/reviseOwner')}}';
  1361. window.tempTip.confirm('当前退货记录货主名与录入商品的货主不匹配! ' + '确定校正退货记录货主名吗?', () => {
  1362. window.axios.post(url, {
  1363. commodityOwnerId: _this.commodityOwnerId,
  1364. id_rejected_bill: id_rejected_bill
  1365. }).then(res => {
  1366. if (res.data.success === 'true') {
  1367. let owner_name = '';
  1368. _this.owners.forEach(function (owner) {
  1369. if (owner.id == _this.commodityOwnerId) {
  1370. owner_name = owner.name;
  1371. }
  1372. })
  1373. _this.billInputting.id_owner = _this.commodityOwnerId;
  1374. _this.rejectedBills.forEach(function (rejectedBill) {
  1375. if (id_rejected_bill == rejectedBill.id) rejectedBill.owner_name = owner_name;
  1376. })
  1377. } else {
  1378. tempTip.setDuration(3000);
  1379. tempTip.show(res.data.message);
  1380. return;
  1381. }
  1382. }).catch(err => {
  1383. window.tempTip.setDuration(3000);
  1384. window.tempTip.show("网络错误:" + err);
  1385. return;
  1386. });
  1387. });
  1388. },
  1389. endAndPackCommitEdit: function () {
  1390. let _this = this;
  1391. if (_this.items.length === 0) {
  1392. if (confirm('没有填加明细项,确定要退出详细编辑模式吗?')) {
  1393. _this.cancelPackCommitEdit();
  1394. }
  1395. return;
  1396. } else {
  1397. if (!confirm('确定要提交填加的明细项吗?提交后即不可修改')) {
  1398. return;
  1399. }
  1400. }
  1401. let ids = [];
  1402. _this.items.forEach(function (item) {
  1403. ids.push(item.id);
  1404. });
  1405. let url = '{{url('apiLocal/rejectedBillItem/packConfirm')}}';
  1406. tempTip.setDuration(5000);
  1407. tempTip.waitingTip('与外部交互中,请稍候');
  1408. axios.post(url, {'ids': ids}).then(function (response) {
  1409. _this.cleanError();
  1410. tempTip.cancelWaitingTip();
  1411. if (response && response.data && response.data.success !== 'false') {
  1412. if (response.data.success == 'exception') {
  1413. _this.status.lockingIsLoadedInput = true;
  1414. _this.billInputting.is_loaded = 3;
  1415. tempTip.show('富勒入库异常,请手动校对');
  1416. } else if (typeof (response.data.bill_is_loaded) != 'undefined') {
  1417. if (response.data.bill_is_loaded === true) {
  1418. _this.status.editingBill.is_loaded = 1;
  1419. _this.billInputting.is_loaded = 1;
  1420. _this.billInputting.isLoadSign = true;
  1421. // _this.status.lockingIsLoadedInput=true;
  1422. tempTip.okWindow('该批商品状态已改为“入库”', '已处理');
  1423. }
  1424. }
  1425. tempTip.setDuration(5000);
  1426. switch (response.data.remote_result) {
  1427. case 'fail':
  1428. tempTip.show('与客户服务器通讯异常,明细未被外部处理,请联系系统相关同事');
  1429. break;
  1430. case 'none':
  1431. tempTip.show('客户未返回明细处理信息,请联系系统相关同事检查');
  1432. break;
  1433. case 'received':
  1434. tempTip.show('该单之前已提交过给客户服务器');
  1435. break;
  1436. case 'storable':
  1437. tempTip.showSuccess('WMS尚未推单,客户返回可以入库,所以状态为“待推单”', '已处理该待推单');
  1438. break;
  1439. default:
  1440. tempTip.showSuccess('成功录入所有退单商品并已上传至外部');
  1441. break;
  1442. }
  1443. _this.status.endAndPackCommitEdited = true;
  1444. _this.cancelPackCommitEdit();
  1445. } else {
  1446. tempTip.setDuration(4000);
  1447. let fail_info = '';
  1448. if (response.data)
  1449. fail_info = response.data.fail_info;
  1450. tempTip.show('录入明细列表失败,请重试:' + fail_info)
  1451. }
  1452. }).catch(function (response) {
  1453. tempTip.cancelWaitingTip();
  1454. tempTip.setDuration(3000);
  1455. let fail_info = '';
  1456. if (response.data)
  1457. fail_info = response.data.fail_info;
  1458. tempTip.show('提交失败,请重试:' + fail_info);
  1459. alert('连接错误:' + response)
  1460. });
  1461. },
  1462. cancelPackCommitEdit: function () {
  1463. let _this = this;
  1464. if (_this.items.length === 0 && !_this.status.endAndPackCommitEdited) {
  1465. _this.unlockBillPanel();
  1466. return;
  1467. } else {
  1468. if (_this.status.endAndPackCommitEdited) {
  1469. _this.unlockBillPanel();
  1470. return;
  1471. } else {
  1472. if (!confirm('已填加的明细尚未提交,回到表头编辑将取消已填加明细,是否确定?')) {
  1473. return;
  1474. }
  1475. }
  1476. }
  1477. let ids = [];
  1478. for (let i = _this.status.existItemsBeforeAdd; i < _this.items.length; i++) {
  1479. ids.push(_this.items[i].id);
  1480. }
  1481. if (ids.length === 0) {
  1482. _this.unlockBillPanel();
  1483. return;
  1484. }
  1485. let url = '{{url('apiLocal/rejectedBillItem/packDestroy')}}';
  1486. axios.post(url, {'ids': ids}).then(function (response) {
  1487. _this.cleanError();
  1488. if (response.data.success === 'true') {
  1489. _this.status.editingBill = null;
  1490. _this.unlockBillPanel();
  1491. } else {
  1492. tempTip.show('数据操作失败,请重试:' + response.data.fail_info)
  1493. }
  1494. }).catch(function (response) {
  1495. tempTip.setDuration(3000);
  1496. tempTip.show('提交失败,请重试:' + response.data.fail_info)
  1497. alert('连接错误:' + response)
  1498. });
  1499. },
  1500. lockBillPanel: function () {
  1501. this.status.lockingBillPanel = true;
  1502. $('input,select').blur();
  1503. },
  1504. unlockBillPanel: function () {
  1505. this.status.lockingBillPanel = false;
  1506. this.status.editingBill = null;
  1507. this.status.editingBillId = '';
  1508. this.shiftToCreate();
  1509. },
  1510. getRecentRejectedBills: function () {
  1511. let _this = this;
  1512. let url = '{{url('apiLocal/rejectedBill/apiGetRecent')}}';
  1513. axios.post(url).then(function (response) {
  1514. if (response.data.success === 'true') {
  1515. _this.rejectedBills = response.data.rejectedBills;
  1516. _this.setEditingBill(_this.status.editingBillId)
  1517. } else {
  1518. tempTip.show('加载新增内容失败,可尝试刷新页面');
  1519. }
  1520. }).catch(function (response) {
  1521. alert('连接错误:' + response);
  1522. tempTip.show('加载新增内容失败,可尝试刷新页面!');
  1523. });
  1524. },
  1525. getItemsUnderBill: function (billId, func) {
  1526. let _this = this;
  1527. let url = '{{url('apiLocal/rejectedBillItem/apiGet')}}';
  1528. axios.post(url, {id_rejected_bill: billId}).then(function (response) {
  1529. if (response.data.success === 'true') {
  1530. response.data.items.forEach(function (item) {
  1531. item.isEditing = false;
  1532. });
  1533. _this.items = response.data.items;
  1534. if (typeof func !== 'undefined') {
  1535. func()
  1536. }
  1537. _this.listenEnterAndJump();
  1538. setTimeout(function () {
  1539. $('#barcode_goods').focus();
  1540. }, 500)
  1541. } else {
  1542. tempTip.show('加载相关明细失败,可尝试刷新页面');
  1543. }
  1544. }).catch(function (response) {
  1545. alert('连接错误:' + response);
  1546. tempTip.show('加载相关明细失败,可尝试刷新页面!');
  1547. });
  1548. },
  1549. deleteBill: function (rejectedBill) {
  1550. if (!confirm('确定要删除退货信息“' + rejectedBill.owner_name + ':' + rejectedBill.logistic_number_return + '”吗?')) {
  1551. return;
  1552. }
  1553. let _this = this;
  1554. let url = "{{url('rejectedBill')}}/" + rejectedBill.id;
  1555. axios.delete(url, {id: rejectedBill.id})
  1556. .then(function (response) {
  1557. if (response.data.success) {
  1558. for (let i = 0; i < _this.rejectedBills.length; i++) {
  1559. if (_this.rejectedBills[i].id === rejectedBill.id) {
  1560. _this.rejectedBills.splice(i, 1);
  1561. break;
  1562. }
  1563. }
  1564. tempTip.setDuration(1000);
  1565. tempTip.showSuccess('删除退货信息"' + rejectedBill.owner_name + ':' + rejectedBill.logistic_number_return + '"成功!')
  1566. } else {
  1567. tempTip.setDuration(1000);
  1568. tempTip.show('删除退货信息"' + rejectedBill.owner_name + ':' + rejectedBill.logistic_number_return + '"失败!')
  1569. }
  1570. })
  1571. .catch(function (err) {
  1572. tempTip.setDuration(3000);
  1573. tempTip.show('删除退货信息失败!' + '网络错误:' + err);
  1574. });
  1575. },
  1576. deleteItem: function (e) {
  1577. if (!confirm('确定要删除该明细吗?不可恢复')) {
  1578. return
  1579. }
  1580. let _this = this;
  1581. let id = $(e.target).parents('tr').attr('data-id');
  1582. let url = '{{url('apiLocal/rejectedBillItem/apiDelete')}}';
  1583. axios.post(url, {id: id}).then(function (response) {
  1584. if (response.data.success === 'true') {
  1585. _this.items.forEach(function (item, i) {
  1586. if (item.id + '' === id + '') {
  1587. _this.items.splice(i, 1);
  1588. }
  1589. });
  1590. _this.cleanItem();
  1591. } else {
  1592. tempTip.show('删除失败,可尝试刷新页面再操作');
  1593. }
  1594. }).catch(function (response) {
  1595. tempTip.show('删除失败,可尝试刷新页面!');
  1596. });
  1597. },
  1598. editBill: function (e) {
  1599. let _this = this;
  1600. let billId = $(e.target).parent('tr').attr('data-id');
  1601. let billTarget = '';
  1602. this.rejectedBills.every(function (bill) {
  1603. if (bill.id + '' === billId + '') {
  1604. billTarget = bill;
  1605. return false;
  1606. }
  1607. return true;
  1608. });
  1609. if (billTarget) {
  1610. this.billInputting = JSON.parse(JSON.stringify(billTarget));
  1611. this.shiftToEdit();
  1612. this.setEditingBill(billTarget.id)
  1613. }
  1614. this.getItemsUnderBill(billTarget.id, function () {
  1615. _this.status.existItemsBeforeAdd = _this.items.length;
  1616. });
  1617. },
  1618. editItem: function (e) {
  1619. let _this = this;
  1620. let itemId = $(e.target).parent('tr').attr('data-id');
  1621. let itemTarget = '';
  1622. this.items.every(function (item) {
  1623. if (item.id + '' === itemId + '') {
  1624. itemTarget = item;
  1625. return false;
  1626. }
  1627. return true;
  1628. });
  1629. if (itemTarget) {
  1630. // itemTarget.packageImages = itemTarget.package_images;//package_images
  1631. // itemTarget.commodityImages = itemTarget.commodity_images;//commodity_images
  1632. // delete itemTarget.package_images;
  1633. // delete itemTarget.commodity_images;
  1634. this.itemInputting = JSON.parse(JSON.stringify(itemTarget));
  1635. this.shiftToEditItem();
  1636. this.setEditingItem(itemTarget.id)
  1637. }
  1638. // this.getItemsUnderBill(this.status.editingBillId,function () {});
  1639. },
  1640. shiftToEditItem: function () {
  1641. this.cleanError();
  1642. this.status.itemCreating = false;
  1643. this.status.itemEditing = true;
  1644. setTimeout(function () {
  1645. $('.tooltipOn').tooltip({'trigger': 'hover'});
  1646. }, 50)
  1647. },
  1648. shiftToEdit: function () {
  1649. this.cleanError();
  1650. this.status.billCreating = false;
  1651. this.status.billEditing = true;
  1652. setTimeout(function () {
  1653. $('.tooltipOn').tooltip({'trigger': 'hover'});
  1654. }, 50)
  1655. },
  1656. shiftToCreateItem: function () {
  1657. this.cleanError();
  1658. this.cleanItem();
  1659. this.status.itemCreating = true;
  1660. this.status.itemEditing = false;
  1661. this.items.forEach(function (item) {
  1662. item.isEditing = false;
  1663. });
  1664. $('.tooltipOn').tooltip('hide').tooltip({'trigger': 'hover'});
  1665. },
  1666. shiftToCreate: function () {
  1667. this.cleanError();
  1668. this.cleanHeader();
  1669. this.status.billCreating = true;
  1670. this.status.billEditing = false;
  1671. this.status.editingBill = null;
  1672. this.rejectedBills.forEach(function (rejectedBill) {
  1673. if (rejectedBill.isEditing === true) {
  1674. rejectedBill.isEditing = false;
  1675. return false;
  1676. }
  1677. });
  1678. $('.tooltipOn').tooltip('hide').tooltip({'trigger': 'hover'});
  1679. },
  1680. locateIdOwner: function (e) {
  1681. let _this = this;
  1682. let $target = $(e.target);
  1683. this.owners.forEach(function (owner) {
  1684. if (owner.name.includes($target.val())) {
  1685. _this.billInputting.id_owner = owner.id;
  1686. }
  1687. });
  1688. },
  1689. locateLogistic: function (e) {
  1690. let _this = this;
  1691. let $target = $(e.target);
  1692. this.logistics.forEach(function (logistic) {
  1693. if (logistic.name.includes($target.val())) {
  1694. _this.billInputting.id_logistic_return = logistic.id;
  1695. }
  1696. });
  1697. },
  1698. //根据退回单寻找WMS订单填充已有字段
  1699. seek_order() {
  1700. let _this = this;
  1701. let logistic_number_return = this.billInputting.logistic_number_return;
  1702. if (!logistic_number_return) return;
  1703. axios.post('{{url('apiLocal/rejectedBill/seekOrder')}}', {logistic_number_return: logistic_number_return})
  1704. .then(function (response) {
  1705. if (response.data.success) {
  1706. if (response.data.data.owner_id) _this.billInputting.id_owner = response.data.data.owner_id;
  1707. if (response.data.data.logistic_id) _this.billInputting.id_logistic_return = response.data.data.logistic_id;
  1708. if (response.data.data.consignee_name) _this.billInputting.sender = response.data.data.consignee_name;
  1709. if (response.data.data.consignee_phone) _this.billInputting.mobile_sender = response.data.data.consignee_phone;
  1710. if (response.data.data.client_code) _this.billInputting.order_number = response.data.data.client_code;
  1711. if (response.data.data.logistic_number) _this.billInputting.logistic_number = response.data.data.logistic_number;
  1712. tempTip.setDuration(2000);
  1713. tempTip.showSuccess('原单信息已填充');
  1714. return;
  1715. }
  1716. tempTip.setDuration(2000);
  1717. tempTip.show('没有找到对应的数据,可手动填写 ');
  1718. });
  1719. },
  1720. // 开启摄像头
  1721. enableCamera(enableVideo) {
  1722. this.videoEnabled = enableVideo;
  1723. MediaUtils.getUserMedia(enableVideo, false, function (err, stream) {
  1724. if (err) {
  1725. throw err;
  1726. } else {
  1727. let photo=document.getElementById('photo');
  1728. photo.srcObject = stream;
  1729. photo.play();
  1730. }
  1731. });
  1732. },
  1733. // 关闭摄像头
  1734. closeCamera() {
  1735. let stream = document.getElementById('photo').srcObject;
  1736. let tracks = stream.getTracks();
  1737. tracks.forEach(function(track) {
  1738. track.stop();
  1739. });
  1740. document.getElementById('photo').srcObject = null;
  1741. },
  1742. //拍照
  1743. takePhoto(id,index){
  1744. let photo=document.getElementById('photo');
  1745. let canvas=document.getElementById('canvas');
  1746. //绘制canvas图形
  1747. canvas.getContext('2d').drawImage(photo, 0, 0, 400, 300);
  1748. let img = document.getElementById('canvas').toDataURL();
  1749. // 这里的img就是得到的图片
  1750. this.closeCamera();
  1751. let blob=this.dataUrlToBlob(img);
  1752. this.submitFile(blob,id,index);
  1753. },
  1754. dataUrlToBlob(imgDataUrl) {
  1755. let imgUrl = window.atob(imgDataUrl.split(',')[1])
  1756. let ab = new ArrayBuffer(imgUrl.length)
  1757. let ia = new Uint8Array(ab)
  1758. for (let i = 0; i < imgUrl.length; i++) {
  1759. ia[i] = imgUrl.charCodeAt(i)
  1760. }
  1761. return new Blob([ab],{type:'image/jpeg'})
  1762. },
  1763. submitFile(blob,id,index){
  1764. window.tempTip.setDuration(3000);
  1765. let formData=new FormData();
  1766. formData.append('files[]', blob,'rejected_bill_item'+id+'.jpg')
  1767. formData.append("id",id);
  1768. window.tempTip.postBasicRequest('{{url('apiLocal/rejectedBillItem/apiUpload')}}',formData,res=>{
  1769. if (this.items[index].upload_files.length===0) this.$set(this.items[index],'upload_files',res);
  1770. else this.$set(this.items[index],'upload_files',this.items[index].upload_files.concat(res));
  1771. return "上传成功";
  1772. },false,true);
  1773. },
  1774. certiimg(id,type){
  1775. this.submitImageType=type;
  1776. $('#'+id).click();
  1777. },
  1778. submitImages(e,index){
  1779. let type=this.submitImageType;
  1780. let files=e.target.files;
  1781. window.tempTip.setDuration(3000);
  1782. if (files.length===0){window.tempTip.show("未选定图片!");return;}
  1783. let formData=new FormData();
  1784. for (let i=0;i<files.length;i++){
  1785. if (files[i].size >=5242880){window.tempTip.show("图片大小不能超过5MB!");return;}
  1786. formData.append("files[]",files[i]);
  1787. }
  1788. formData.append("id",this.items[index].id);
  1789. formData.append("type",type);
  1790. window.tempTip.postBasicRequest('{{url('apiLocal/rejectedBillItem/apiUpload')}}',formData,res=>{
  1791. if (type==='外箱'){
  1792. if (this.items[index].package_images.length===0) this.$set(this.items[index],'package_images',res);
  1793. else this.$set(this.items[index],'package_images',this.items[index].package_images.concat(res));
  1794. }
  1795. if (type==='产品'){
  1796. if (this.items[index].commodity_images.length===0) this.$set(this.items[index],'commodity_images',res);
  1797. else this.$set(this.items[index],'commodity_images',this.items[index].commodity_images.concat(res));
  1798. }
  1799. return "上传成功";
  1800. },false,true);
  1801. },
  1802. removeCommonImg(id){
  1803. $('#'+id).remove();
  1804. },
  1805. commonImg(id,uploadFiles){
  1806. let div = "";
  1807. let isBtn = '@can('运输管理-运单-图片删除') true @endcan ';
  1808. for(let i=0;i<uploadFiles.length;i++){
  1809. let btn = isBtn ? "<button type='button' class='btn btn-sm btn-danger' onclick='vueList.btnDeleteImg(this)' data-url='"+uploadFiles[i].url+"' value='"+id+"' style='position: relative;float: right;margin-top: -30px;' >删除</button>" : "";
  1810. let href = this.imgPrefix+uploadFiles[i].url+'-common.'+uploadFiles[i].type;
  1811. let src = this.imgPrefix+uploadFiles[i].url+'-common.'+uploadFiles[i].type;
  1812. div += "<div><a target='_blank' href='"+href+"'><img alt='#' src='"+src+"' style='position: relative;' ></a>"+btn+"</div>"
  1813. }
  1814. $('#'+id).after(
  1815. "<div id=\"common_"+id+"\" style='position: absolute;padding-bottom: 2px;z-index: 99'>" +
  1816. "<div style='position:absolute;left: -50px' class='overflow-y-scrollbar-200'>"+div+
  1817. "</div></div>");
  1818. },
  1819. btnDeleteImg(e){
  1820. let idstr = $(e).val();
  1821. let id = idstr.substr( idstr.indexOf('_')+1);
  1822. let url = e.getAttribute("data-url");
  1823. if (!confirm('确定要删除所选图片吗?'))return;
  1824. this.destroyImg(id,url);
  1825. },
  1826. destroyImg(id,url = null){
  1827. id= id.replace(/[^0-9]/ig,"");//抽取数字部分
  1828. window.tempTip.postBasicRequest('{{url('apiLocal/rejectedBillItem/apiDeleteImg')}}',{id:id,url:url},()=>{
  1829. if (url){
  1830. this.items.some((item,i)=>{
  1831. if (item.id==id){
  1832. item.upload_files.some((file,j)=>{
  1833. if (file.url === url){this.$delete(this.items[i].upload_files,j);return true;}
  1834. });
  1835. item.package_images.some((file,j)=>{
  1836. if (file.url === url){this.$delete(this.items[i].package_images,j);return true;}
  1837. });
  1838. item.commodity_images.some((file,j)=>{
  1839. if (file.url === url){this.$delete(this.items[i].commodity_images,j);return true;}
  1840. });
  1841. return true;
  1842. }
  1843. });
  1844. }else{
  1845. this.items.forEach((item,i)=>{
  1846. if (id.includes(item.id))this.$set(this.items[i],'upload_files',[]);
  1847. if (id.includes(item.id))this.$set(this.items[i],'commodity_images',[]);
  1848. if (id.includes(item.id))this.$set(this.items[i],'package_images',[]);
  1849. });
  1850. }
  1851. return "删除成功";
  1852. });
  1853. },
  1854. },
  1855. filters: {
  1856. isLoaded: function (value) {
  1857. return value == 1 ? '是' : '否';
  1858. },
  1859. dateNoYear: function (value) {
  1860. if (!value) return '';
  1861. return value.substr(5, 11);
  1862. }
  1863. },
  1864. });
  1865. </script>
  1866. @endsection