create.blade.php 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367
  1. @extends('layouts.app')
  2. @section('content')
  3. <div id="nav2">
  4. @component('process.menu')@endcomponent
  5. </div>
  6. <div class="container-fluid mt-3" id="list">
  7. <div class="card col-md-8 offset-md-2">
  8. <div class="card-body">
  9. <div class="form-group row">
  10. <label class="col-3 col-form-label text-right" >单据号</label>
  11. <input v-model="process.wms_code" class="form-control col-6 " :class="error.wms_code && error.wms_code.length>0 ? 'is-invalid' :''">&nbsp;&nbsp;&nbsp;
  12. <input class="btn btn-info col-2" type="button" @click="addProcessContent()" value="新增库单据">
  13. <span v-if="error.wms_code && error.wms_code.length>0" class="invalid-feedback col-7 offset-3 mt-0" role="alert">
  14. <strong>@{{ error.wms_code[0] }}</strong>
  15. </span>
  16. </div>
  17. <div class="form-group row" v-if="processContents.length>0" v-for="processContent in processContents" >
  18. <div class="col-8 offset-md-3 pl-0 pt-2 border rounded" :style="processContent.addBtnShow?'': 'opacity:0.88;background-color:#f5f5f5;transform:scale(0.9)'">
  19. <div class="row pt-2">
  20. <label class="col-3 col-form-label text-right">单据号@{{ processContent.i }}</label>
  21. <b class="col-7">@{{ processContent.wms_code }}</b>
  22. </div>
  23. <div class="row pt-2" v-if="processContent.addBtnShow">
  24. <label class="col-3 col-form-label text-right">选择商品</label>
  25. <span class=" col-9 input-group" style="max-height: 150px; overflow-y: scroll;border-radius:5px;opacity:1.5;text-align: center;">
  26. <ul class="list-group tooltipTarget" title="双击选择商品" style="width: 100%" onselectstart="return false;">
  27. <li v-for="commodity in processContent.commodities" :id="commodity.id" class="list-group-item list-group-item-action p-0 m-0"
  28. @dblclick="selectedCommodity(commodity,processContent.wms_code)" :class="processContent.commodity_id && processContent.commodity_id==commodity.id && processContent.lineNo==commodity.lineNo? 'active' :''">
  29. <p class="form-inline" style="cursor: default;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;"><small style="overflow: hidden;" :title="commodity.name" class="text-left text-info col-6">@{{ commodity.name }}</small>
  30. <small class="text-left col-6" style="overflow: hidden;">
  31. <a v-for="barcode in commodity.barcodes">@{{ barcode.code }}&nbsp;&nbsp;&nbsp;</a>
  32. </small></p></li>
  33. </ul>
  34. </span>
  35. </div>
  36. <div class="row pt-2">
  37. <label class="col-3 col-form-label text-right">商品名</label>
  38. <b class="col-7">@{{ processContent.commodity_name }}</b>
  39. </div>
  40. <div class="row pt-2">
  41. <label class="col-3 col-form-label text-right">条码</label>
  42. <ul class="p-0 m-0 ml-3 list-unstyled list-inline" v-if="processContent.commodity_barcodes && processContent.commodity_barcodes.length>0">
  43. <li v-for="barcode in processContent.commodity_barcodes"><small>@{{ barcode.code }}</small></li>
  44. </ul>
  45. </div>
  46. <div class="row pt-2">
  47. <label class="col-3 col-form-label text-right">SKU</label>
  48. <b class="col-7">@{{ processContent.commodity_sku }}</b>
  49. </div>
  50. <div class="row pt-2">
  51. <label class="col-3 col-form-label text-right">单据类型</label>
  52. <select disabled v-model="processContent.bill_type" class="col-7 form-control"
  53. :class="processContentError[processContent.wms_code] && processContentError[processContent.wms_code].bill_type ? 'is-invalid' :''">
  54. <option value="移库单">移库单</option>
  55. <option value="入库单">入库单</option>
  56. <option value="出库单">出库单</option>
  57. </select>
  58. </div>
  59. <div class="row pt-2">
  60. <label class="col-3 col-form-label text-right">数量</label>
  61. <input :readonly="!processContent.addBtnShow" v-model="processContent.amount" type="text" class="form-control col-7"
  62. :class="processContentError[processContent.wms_code] && processContentError[processContent.wms_code].amount ? 'is-invalid' :''">
  63. <span v-if="processContentError[processContent.wms_code] && processContentError[processContent.wms_code].amount" class="invalid-feedback col-7 offset-3 mt-0" role="alert">
  64. <strong>@{{ processContentError[processContent.wms_code].amount[0] }}</strong>
  65. </span>
  66. </div>
  67. <div class="col-8 offset-2 pt-2" v-if="processContent.addBtnShow">
  68. <input type="button" @click="confirmStore(processContent.wms_code,processContent.commodity_id,processContent.amount)" value="确定新增" class="btn btn-primary form-control">
  69. </div>
  70. <div class="col-8 offset-2 pt-2 pb-2">
  71. <input type="button" @click="deleteProcessContent(processContent.wms_code)" value="删除" class="btn btn-danger form-control">
  72. </div>
  73. </div>
  74. </div>
  75. <div class="form-group row">
  76. <label class="col-3 col-form-label text-right" >货主</label>
  77. <input readonly v-if="processContents.length>0" :value="processContents[processContents.length-1].owner_name" class="form-control col-7" :class="error.owner_id && error.owner_id.length>0 ? 'is-invalid' :''">
  78. <span v-if="error.owner_id && error.owner_id.length>0" class="invalid-feedback col-7 offset-3 mt-0" role="alert">
  79. <strong>@{{ error.owner_id[0] }}</strong>
  80. </span>
  81. </div>
  82. <div class="form-group row">
  83. <label class="col-3 col-form-label text-right" >加工类型</label>
  84. <select v-model="process.process_method_id" class="form-control col-7" :class="error.process_method_id && error.process_method_id.length>0 ? 'is-invalid' :''">
  85. <option v-for="processMethod in processMethods" :value="processMethod.id">@{{ processMethod.name }}</option>
  86. </select>
  87. </div>
  88. <div class="form-group row">
  89. <label class="col-3 col-form-label text-right" >加工数量</label>
  90. <input v-model="process.amount" type="text" class="form-control col-7" :class="error.amount && error.amount.length>0 ? 'is-invalid' :''">
  91. <span v-if="error.amount && error.amount.length>0" class="invalid-feedback col-7 offset-3 mt-0" role="alert">
  92. <strong>@{{ error.amount[0] }}</strong>
  93. </span>
  94. </div>
  95. <div class="form-group row">
  96. <label class="col-3 col-form-label text-right" >单价</label>
  97. <input v-model="process.unit_price" type="text" class="form-control col-7" :class="error.unit_price && error.unit_price.length>0 ? 'is-invalid' :''">
  98. <span v-if="error.unit_price && error.unit_price.length>0" class="invalid-feedback col-7 offset-3 mt-0" role="alert">
  99. <strong>@{{ error.unit_price[0] }}</strong>
  100. </span>
  101. </div>
  102. <div class="form-group row">
  103. <label class="col-3 col-form-label text-right" >备注(选填)</label>
  104. <textarea v-model="process.remark" type="text" class="form-control col-7"></textarea>
  105. </div>
  106. <div class="form-group row">
  107. <label class="col-3 col-form-label text-right" >引用教程(选填)</label>
  108. <span class=" col-7 input-group p-0" style="max-height: 150px; overflow-y: scroll;border-radius:5px;opacity:0.7;text-align: center;">
  109. <ul class="list-group" style="width: 100%" onselectstart="return false;">
  110. <li v-for="tutorial in tutorials" :data-original-title="tutorial.style ? '双击删除教程' :'双击添加教程'" :id="tutorial.id" class="tooltipTarget list-group-item list-group-item-action p-0 m-0"
  111. @dblclick="selectedTutorial(tutorial)" :class="tutorial.style ? 'active' :''">
  112. <p class="form-inline" style="cursor: default;">@{{ tutorial.name }}</p></li>
  113. </ul>
  114. <div class="mt-0 form-inline">
  115. <button type="button" @click="addTutorial()" class="btn btn-sm btn-outline-primary">新增教程</button>
  116. <button type="button" @click="refreshTutorial()" class="btn btn-sm btn-outline-secondary ml-2">刷新教程</button>
  117. </div>
  118. </span>
  119. </div>
  120. <div class="form-group row">
  121. <div class="col-8 offset-2">
  122. <input type="button" @click="submit()" class="btn btn-success form-control" value="提交">
  123. </div>
  124. </div>
  125. </div>
  126. </div>
  127. </div>
  128. @endsection
  129. @section('lastScript')
  130. <script>
  131. let vueList=new Vue({
  132. el:'#list',
  133. data:{
  134. process:{wms_code:'',owner_id:'',process_method_id:'',unit_price:'',remark:'',amount:''},
  135. error:{wms_code:[],owner_id:[],process_method_id:[],unit_price:[],amount:[]},
  136. processContentError:[],
  137. processContents:[],
  138. processMethods:[
  139. @foreach($processMethods as $processMethod)
  140. {!! $processMethod !!},
  141. @endforeach
  142. ],
  143. tutorials:[],
  144. selectedTutorials:[],
  145. msg:false,
  146. },
  147. watch:{
  148. processContents:{
  149. handler(){
  150. if (this.processContents.length===1){
  151. this.process.owner_id=this.processContents[(this.processContents.length)-1].owner_id;
  152. this.getTutorial(this.processContents[(this.processContents.length)-1].owner_id);
  153. }
  154. }
  155. },
  156. },
  157. mounted:function(){
  158. $(".tooltipTarget").tooltip({'trigger':'hover'});
  159. },
  160. methods:{
  161. //新增库单据
  162. addProcessContent(){
  163. let _this=this;
  164. let wms_code=_this.process.wms_code;
  165. if (!wms_code){
  166. tempTip.setDuration(3000);
  167. tempTip.show('未输入单据号!');
  168. return;
  169. }
  170. if (_this.processContents.length>0 && _this.processContents[_this.processContents.length-1].addBtnShow) {
  171. tempTip.setDuration(3000);
  172. tempTip.show('下方单据未操作无法录入第二单!');
  173. return;
  174. };
  175. let isUnique=true;
  176. _this.processContents.every(function (processContent) {
  177. if (processContent.wms_code==wms_code){
  178. isUnique=false;
  179. return false;
  180. }
  181. return true;
  182. });
  183. if (!isUnique){
  184. tempTip.setDuration(3000);
  185. tempTip.show('下方已添加该单据!');
  186. return;
  187. }
  188. if (_this.msg){
  189. tempTip.setDuration(999999);
  190. tempTip.waitingTip("数据读取中......请稍后!");
  191. return;
  192. }
  193. _this.msg=true;
  194. axios.post('{{url("api/thirdPart/flux/process/getProcessContent")}}',{wms_code:wms_code})
  195. .then(function (response) {
  196. console.log(response.data);
  197. if (_this.msg)_this.msg=false;
  198. tempTip.cancelWaitingTip();
  199. tempTip.setDuration(3000);
  200. if (response.data.error){
  201. tempTip.setDuration(3000);
  202. tempTip.show(response.data.error);
  203. return;
  204. }
  205. let processContent={};
  206. processContent['wms_code']=response.data.wms_code;
  207. processContent['owner_name']=response.data.owner_name;
  208. processContent['owner_id']=response.data.owner_id;
  209. processContent['commodities']=response.data.commodities;
  210. processContent['commodity_id']='';
  211. processContent['commodity_name']='';
  212. processContent['commodity_barcodes']=[];
  213. processContent['commodity_sku']='';
  214. processContent['bill_type']=response.data.bill_type;
  215. processContent['amount']='';
  216. processContent['lineNo']='';
  217. processContent['addBtnShow']=true;
  218. _this.processContents.unshift(processContent);
  219. }).catch(function (err) {
  220. if (_this.msg)_this.msg=false;
  221. tempTip.cancelWaitingTip();
  222. tempTip.setDuration(3000);
  223. tempTip.show('查询单据号失败!网络错误:'+err);
  224. });
  225. },
  226. //确定新增
  227. confirmStore(wms_code,commodity_id,amount){
  228. if (!commodity_id) {
  229. tempTip.setDuration(2000);
  230. tempTip.show("尚未选择商品!");
  231. return;
  232. }
  233. if (!amount) {
  234. tempTip.setDuration(2000);
  235. tempTip.show("尚未填写数量!");
  236. return;
  237. }
  238. let _this=this;
  239. _this.processContents.every(function (processContent) {
  240. if (processContent.wms_code==wms_code) {
  241. processContent.addBtnShow=false;
  242. return false;
  243. }
  244. return true;
  245. });
  246. },
  247. //删除新增
  248. deleteProcessContent(wms_code){
  249. let _this=this;
  250. _this.processContents.every(function (processContent,i) {
  251. if (processContent.wms_code==wms_code) {
  252. _this.processContents.splice(i,1);
  253. return false;
  254. }
  255. return true;
  256. });
  257. },
  258. //获取教程
  259. getTutorial(owner_id){
  260. let _this=this;
  261. axios.post("{{url('process/ownerGetTutorials')}}"+"/"+owner_id)
  262. .then(function (response) {
  263. _this.tutorials=[];
  264. response.data.forEach(function (tutorialOne) {
  265. let tutorial={};
  266. tutorial['id']=tutorialOne.id;
  267. tutorial['name']=tutorialOne.name;
  268. tutorial['style']=false;
  269. _this.tutorials.push(tutorial);
  270. });
  271. }).catch(function (err) {
  272. tempTip.setDuration(5000);
  273. tempTip.show('获取教程失败!网络错误:'+err);
  274. });
  275. },
  276. //选择商品
  277. selectedCommodity(commodity,wms_code){
  278. let _this=this;
  279. _this.processContents.every(function (processContent) {
  280. if (processContent.wms_code==wms_code){
  281. processContent.commodity_id=commodity.id;
  282. processContent.commodity_name=commodity.name;
  283. processContent.commodity_barcodes=commodity.barcodes;
  284. processContent.commodity_sku=commodity.sku;
  285. processContent.amount=commodity.amount;
  286. processContent.lineNo=commodity.lineNo;
  287. return false;
  288. }
  289. return true;
  290. });
  291. },
  292. //选择教程
  293. selectedTutorial(tutorial){
  294. let _this=this;
  295. if (tutorial.style){
  296. for (let i=0;i<_this.selectedTutorials.length;i++){
  297. if (_this.selectedTutorials[i]==tutorial.id) {
  298. _this.selectedTutorials.splice(i,1);
  299. break;
  300. }
  301. }
  302. _this.tutorials.every(function (tutorialOne) {
  303. if (tutorialOne.id==tutorial.id){
  304. tutorialOne.style=false;
  305. return false;
  306. }
  307. return true;
  308. });
  309. }else {
  310. _this.selectedTutorials.push(tutorial.id);
  311. _this.tutorials.every(function (tutorialOne) {
  312. if (tutorialOne.id==tutorial.id){
  313. tutorialOne.style=true;
  314. return false;
  315. }
  316. return true;
  317. });
  318. }
  319. setTimeout(function(){
  320. $(".tooltipTarget").tooltip({'trigger':'hover'});
  321. },10);
  322. },
  323. //异补提交
  324. submit(){
  325. let _this=this;
  326. let owner_id=_this.process.owner_id;
  327. let process_method_id=_this.process.process_method_id;
  328. let unit_price=_this.process.unit_price;
  329. let remark=_this.process.remark;
  330. let amount=_this.process.amount;
  331. _this.processContentError=[];
  332. axios.post('{{url("process")}}',{
  333. owner_id:owner_id,process_method_id:process_method_id,unit_price:unit_price,
  334. remark:remark,amount:amount,processContents:_this.processContents,tutorials:_this.selectedTutorials
  335. }).then(function (response) {
  336. if (response.data.error && response.data.data=="process"){
  337. _this.error=response.data.error;
  338. return;
  339. }
  340. _this.error={wms_code:[],owner_id:[],process_method_id:[],unit_price:[],amount:[]};
  341. if (response.data.error){
  342. _this.processContentError=response.data.error;
  343. return;
  344. }
  345. location.href="{{url('process')}}";
  346. }).catch(function (err) {
  347. tempTip.setDuration(5000);
  348. tempTip.show('提交失败!网络错误:'+err);
  349. });
  350. },
  351. //去往新增教程
  352. addTutorial(){
  353. window.open("{{url('maintenance/tutorial/create?owner_id=')}}"+this.process.owner_id);
  354. },
  355. //刷新教程
  356. refreshTutorial(){
  357. if (this.processContents.length>=1 && this.processContents[(this.processContents.length)-1].owner_id){
  358. this.getTutorial(this.processContents[(this.processContents.length)-1].owner_id);
  359. }
  360. }
  361. },
  362. });
  363. </script>
  364. @endsection