create.blade.php 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361
  1. @extends('layouts.app')
  2. @section('title')录入-作业-计费模型@endsection
  3. @section('content')
  4. <div id="nav2">
  5. @component('maintenance.menu')@endcomponent
  6. @component('maintenance.priceModel.operation.menu')
  7. @if(isset($model))
  8. <li class="nav-item">
  9. <a class="nav-link" href="{{URL::current()}}" :class="{active:isActive('edit',5)}">编辑</a>
  10. </li>
  11. @endif
  12. @endcomponent
  13. </div>
  14. <div class="container-fluid mt-2 card" id="container">
  15. @include("maintenance.priceModel.operation._addFeature")
  16. <form method="POST" action="{{url('maintenance/priceModel/operation')}}@if(isset($model))/{{$model->id}}/edit @endif" class="card-body offset-3">
  17. @csrf
  18. <div class="row">
  19. <label class="col-2" for="owner_id">项目</label>
  20. <select id="owner_id" class="selectpicker" multiple data-live-search="true" title="项目(多选)" :class="errors.owner_id ? 'is-invalid' : ''" v-model="model.owner_id">
  21. <option v-for="owner in owners" :value="owner.id">@{{ owner.name }}</option>
  22. </select>
  23. <span class="invalid-feedback mt-0 offset-2" role="alert" v-if="errors.owner_id">
  24. <strong>@{{ errors.owner_id[0] }}</strong>
  25. </span>
  26. <label hidden><input :value="model.owner_id" name="owner_id"></label>
  27. </div>
  28. <div class="row mt-3">
  29. <label for="operation_type" class="col-2">操作类型</label>
  30. <select id="operation_type" :disabled="model.id ? true : false" :class="errors.operation_type ? 'is-invalid' : ''" v-model="model.operation_type" class="col-3 form-control" required>
  31. <option value="入库">入库</option>
  32. <option value="出库">出库</option>
  33. </select>
  34. <label hidden><input name="operation_type" :value="model.operation_type"></label>
  35. <span class="invalid-feedback mt-0 offset-2" role="alert" v-if="errors.operation_type">
  36. <strong>@{{ errors.operation_type[0] }}</strong>
  37. </span>
  38. </div>
  39. <div class="row mt-3">
  40. <label for="strategy" class="col-2">计费策略</label>
  41. <select id="strategy" :disabled="model.id ? true : false" :class="errors.strategy ? 'is-invalid' : ''" class="col-3 form-control" v-model="model.strategy" required>
  42. <option value="默认">默认</option>
  43. <option value="特征">特征</option>
  44. </select>
  45. <label hidden><input name="strategy" :value="model.strategy"></label>
  46. <span class="invalid-feedback mt-0 offset-2" role="alert" v-if="errors.strategy">
  47. <strong>@{{ errors.strategy[0] }}</strong>
  48. </span>
  49. </div>
  50. <div class="row mt-3">
  51. <label for="name" class="col-2">名称</label>
  52. <input id="name" type="text" name="name" :class="errors.name ? 'is-invalid' : ''" class="col-6 form-control" v-model="model.name" required>
  53. <span class="invalid-feedback mt-0 offset-2" role="alert" v-if="errors.name">
  54. <strong>@{{ errors.name[0] }}</strong>
  55. </span>
  56. </div>
  57. <div class="row mt-3" v-if="model.strategy == '特征'">
  58. <label class="col-2">特征:</label>
  59. <label v-if="model.feature">
  60. @{{ model.feature }}
  61. <input hidden name="feature" :value="model.feature" type="text">
  62. </label>
  63. <button type="button" class="btn btn-dark col-2 ml-2" @click="showAddFeatureModal(-1,model.feature)">调整特征</button>
  64. </div>
  65. <div class="row mt-3">
  66. <label for="priority" class="col-2">优先级</label>
  67. <input id="priority" type="number" min="0" name="priority" :class="errors.priority ? 'is-invalid' : ''" class="col-6 form-control" v-model="model.priority" required>
  68. <span class="invalid-feedback mt-0 offset-2" role="alert" v-if="errors.priority">
  69. <strong>@{{ errors.priority[0] }}</strong>
  70. </span>
  71. </div>
  72. <div class="row mt-3" v-if="model.operation_type == '出库'">
  73. <label class="col-2" for="isDiscount">是否满减</label>
  74. <div class="col-2">
  75. <input type="checkbox" id="isDiscount" class="rounded mt-1" v-model="model.isDiscount">
  76. </div>
  77. <div class="col-8 row" v-if="model.isDiscount">
  78. <div class="col-1 cursor-pointer"><span class="fa fa-plus" @click="addDiscount(model.discount_count)"></span></div>
  79. <label class="col-3" for="discount">满减阈值</label>
  80. <input id="discount" v-model="model.discount_count[0]" name="discount_count[]" required
  81. class="form-control form-control-sm col-6" :class="errors.discount_count ? 'is-invalid' : ''" step="1" type="number" min="0">
  82. </div>
  83. </div>
  84. <div class="row mt-1" v-for="(value,i) in model.discount_count" v-if="model.isDiscount && i!=0">
  85. <label class="col-2"></label><div class="col-2"></div>
  86. <div class="col-8 row">
  87. <label class="offset-1 col-3">满减阈值@{{ i+1 }}</label>
  88. <input v-model="model.discount_count[i]" :placeholder="Number(model.discount_count[i-1])+1" name="discount_count[]" required
  89. class="form-control form-control-sm col-6" step="1" type="number" :min="Number(model.discount_count[i-1])+1">
  90. </div>
  91. </div>
  92. <div class="row mt-3">
  93. <label class="col-2" for="isSingle">按单计价</label>
  94. <div class="col-2">
  95. <input type="checkbox" id="isSingle" class="pull-left rounded mt-1" v-model="model.isSingle">
  96. </div>
  97. <div class="col-8 row" v-if="model.isSingle">
  98. <label class="col-3" for="total_price">普通价格</label>
  99. <input id="total_price" name="total_price" v-model="model.total_price"
  100. class="form-control form-control-sm col-6" :class="errors.total_price ? 'is-invalid' : ''" step="0.001" type="number" min="0">
  101. </div>
  102. </div>
  103. <div class="row mt-1" v-if="model.isSingle && model.isDiscount" v-for="(value,i) in model.total_discount_price">
  104. <label class="col-2"></label><div class="col-2"></div>
  105. <div class="col-8 row">
  106. <label class="col-3" for="total_discount_price">满减价(@{{ model.discount_count[i] }}单)</label>
  107. <input id="total_discount_price" name = "total_discount_price[]" v-model="model.total_discount_price[i]"
  108. class="form-control form-control-sm col-6" step="0.001" type="number" min="0">
  109. </div>
  110. </div>
  111. <div class="row mt-3" v-if="!model.isSingle">
  112. <div v-for="(item,i) in model.items" class="card row text-white col-8" :class="i>0 ? 'bg-secondary mt-2' : 'bg-info'">
  113. <div class="card-header">
  114. <div class="pull-left" v-if="i==0"><span @click="addRule()" class="fa fa-plus-square-o" style="cursor: pointer"></span></div>
  115. <div class="pull-right" v-if="model.items.length > 1"><span @click="delRule(i)" class="fa fa-window-close-o" style="cursor: pointer"></span></div>
  116. </div>
  117. <div class="card-body">
  118. <div class="row">
  119. <div class="col-4 form-inline">
  120. <label for="amount"><span v-if="item.strategy=='起步'">起步数:</span><span v-else>计量:</span></label>
  121. <input id="amount" type="number" :class="errors['items.'+i+'.amount'] ? 'is-invalid' : ''" v-model="item.amount" class="form-control" required>
  122. <span class="invalid-feedback mt-0 offset-2" role="alert" v-if="errors['items.'+i+'.amount']">
  123. <strong>必须为整数</strong>
  124. </span>
  125. </div>
  126. <div class="col-4 form-inline">
  127. <label for="unit_id">单位:</label>
  128. <select id="unit_id" v-model="item.unit_id" class="form-control" :class="errors['items.'+i+'.unit_id'] ? 'is-invalid' : ''" required>
  129. <option v-for="unit in units" :value="unit.id">@{{ unit.name }}</option>
  130. </select>
  131. <span class="invalid-feedback mt-0 offset-2" role="alert" v-if="errors['items.'+i+'.unit_id']">
  132. <strong>必选项</strong>
  133. </span>
  134. </div>
  135. <div class="col-4 form-inline">
  136. <label for="unit_price">单价:</label>
  137. <input id="unit_price" type="number" min="0" step="0.001" class="form-control" v-model="item.unit_price" required
  138. :class="errors['items.'+i+'.unit_price'] ? 'is-invalid' : ''">
  139. </div>
  140. <span class="invalid-feedback mt-0 offset-2" role="alert" v-if="errors['items.'+i+'.unit_price']">
  141. <strong>必须为数字且不得为负</strong>
  142. </span>
  143. </div>
  144. <div class="row mt-2">
  145. <label for="out_priority" class="col-2">优先级:</label>
  146. <input type="number" min="0" id="out_priority" v-model="item.priority" :class="errors['items.'+i+'.priority'] ? 'is-invalid' : ''" class="col-5 form-control">
  147. <span class="invalid-feedback mt-0 offset-2" role="alert" v-if="errors['items.'+i+'.priority']">
  148. <strong>必须为整数且数值区间为[0-100]</strong>
  149. </span>
  150. </div>
  151. <div class="row mt-2">
  152. <label for="out_storage_strategy" class="col-2">子策略:</label>
  153. <select id="out_storage_strategy" v-model="item.strategy" class="col-5 form-control"
  154. @change="outRuleUnique(item.strategy)"
  155. :class="errors['items.'+i+'.strategy'] ? 'is-invalid' : ''">
  156. <optgroup v-if="existStrategy.starting && item.strategy!='起步'" label="起步"></optgroup>
  157. <option v-else>起步</option>
  158. <optgroup v-if="existStrategy.default && item.strategy!='默认'" label="默认"></optgroup>
  159. <option v-else>默认</option>
  160. <option>特征</option>
  161. </select>
  162. <span class="invalid-feedback mt-0 offset-2" role="alert" v-if="errors['items.'+i+'.strategy']">
  163. <strong>必选项</strong>
  164. </span>
  165. </div>
  166. <div class="row mt-2" v-if="item.strategy == '特征'">
  167. <label class="col-2">特征:</label>
  168. <label v-if="item.feature">@{{ item.feature }}</label>
  169. <button type="button" class="btn btn-dark col-2 ml-2" @click="showAddFeatureModal(i,item.feature)">调整特征</button>
  170. </div>
  171. <div class="row mt-2" v-if="model.isDiscount" v-for="(value,i) in item.discount_price">
  172. <label class="col-2">满减价(@{{ model.discount_count[i] }}单)</label>
  173. <input class="col-5 form-control form-control-sm" v-model="item.discount_price[i]" required
  174. type="number" step="0.001" min="0">
  175. </div>
  176. </div>
  177. </div>
  178. <label hidden><input name="items" :value="JSON.stringify(model.items)"></label>
  179. </div>
  180. <div class="row mt-3">
  181. <label for="remark" class="col-2">备注</label>
  182. <textarea id="remark" name="remark" class="col-6 form-control" v-model="model.remark"></textarea>
  183. </div>
  184. <div class="row mt-3 offset-1">
  185. <button type="submit" class="btn btn-success col-7">提交</button>
  186. </div>
  187. </form>
  188. </div>
  189. @stop
  190. @section("lastScript")
  191. <script>
  192. new Vue({
  193. el:"#container",
  194. data:{
  195. model:{
  196. id: "{{isset($model) ? $model->id : ''}}",
  197. owner_id:{!! old('owner_id') ? json_encode(old('owner_id')) : (isset($model) ? json_encode(array_column($model->owners->toArray(),"id")) : '[]') !!},
  198. operation_type:"{{old('operation_type') ?? (isset($model) ? $model->operation_type : '')}}",
  199. strategy:"{{old('strategy') ?? (isset($model) ? $model->strategy : '')}}",
  200. name:"{{old('name') ?? (isset($model) ? $model->name : '')}}",
  201. priority:"{{old('priority') ?? (isset($model) ? $model->priority : 0)}}",
  202. feature:"{{old('feature') ?? (isset($model) ? $model->feature : '')}}",
  203. discount_count:"{{old('discount_count') ?? (isset($model) ? $model->discount_count : '')}}",
  204. total_price:"{{old('total_price') ?? (isset($model) ? $model->total_price : '')}}",
  205. total_discount_price:"{{old('total_discount_price') ?? (isset($model) ? $model->total_discount_price : '')}}",
  206. remark:"{{old('remark') ?? (isset($model) ? $model->remark : '')}}",
  207. items:{!! old('items') ? json_encode(old('items')) : (isset($model)&&$model->items ? $model->items : "[{strategy:'',amount:'',unit_id:'',unit_price:'',feature:'',priority:''}]")!!},
  208. },
  209. owners : [
  210. @foreach($owners as $owner)
  211. {id:"{{$owner->id}}",name:"{{$owner->name}}"},
  212. @endforeach
  213. ],
  214. units : [
  215. @foreach($units as $unit)
  216. {id:"{{$unit->id}}",name:"{{$unit->name}}"},
  217. @endforeach
  218. ],
  219. type : {!! json_encode(\App\Feature::type,JSON_UNESCAPED_UNICODE) !!},
  220. logic : ['包含','不包含','等于'],
  221. features : [],
  222. thisIndex : "",
  223. errors:{!! $errors !!},
  224. existStrategy:{default:false,starting:false},
  225. oldFeature : '',
  226. },
  227. mounted(){
  228. this.$set(this.model,"isSingle",!!this.model.total_price);
  229. this.$set(this.model,"isDiscount",!!this.model.discount_count);
  230. this.$set(this.model,"discount_count",this.model.discount_count ? this.model.discount_count.split(",") : [""]);
  231. this.$set(this.model,"total_discount_price",this.model.total_discount_price ? this.model.total_discount_price.split(",") : [""]);
  232. this.model.items.forEach((item,i)=>{
  233. item.discount_price = item.discount_price ? item.discount_price.split(",") : [""];
  234. this.$set(this.model.items,i,item);
  235. });
  236. },
  237. methods:{
  238. outRuleUnique(strategy){
  239. if (strategy==='起步') this.existStrategy.starting = true;
  240. if (strategy==='默认') this.existStrategy.default = true;
  241. let startingSign = true;
  242. let defaultSign = true;
  243. this.model.items.forEach(item=>{
  244. if (item.strategy === '默认')defaultSign = false;
  245. if (item.strategy === '起步')startingSign = false;
  246. });
  247. if (startingSign)this.existStrategy.starting = false;
  248. if (defaultSign)this.existStrategy.default = false;
  249. },
  250. addRule(){
  251. this.model.items.push({
  252. "strategy" : "",
  253. "amount" : "",
  254. "unit_id" : "",
  255. "unit_price" : "",
  256. "feature" : "",
  257. "priority" : "",
  258. "discount_price":new Array(this.model.discount_count.length).fill(""),
  259. });
  260. },
  261. delRule(index){
  262. this.$delete(this.model.items,index);
  263. },
  264. showAddFeatureModal(index,feature){
  265. if (!feature){
  266. this.features = [{
  267. "strategyGroupStartSign": false,
  268. "calculation" : "",
  269. "type" : "",
  270. "id" : "", //特征ID
  271. "logic" : "", //特征逻辑
  272. "describe" : "", //特征信息
  273. "strategyGroupEndSign" : false,
  274. }];
  275. this.thisIndex = index;
  276. $("#addFeatureModal").modal("show");
  277. return;
  278. }
  279. if (this.oldFeature === feature) {
  280. this.thisIndex = index;
  281. $("#addFeatureModal").modal("show");
  282. return;
  283. }
  284. window.axios.post("{{url('maintenance/priceModel/operation/getFeatures')}}", {feature:feature})
  285. .then(res=>{
  286. if (res.data.success){
  287. this.features = res.data.data;
  288. this.oldFeature = feature;
  289. if (!this.features || this.features.length === 0){
  290. this.features = [{
  291. "strategyGroupStartSign": false,
  292. "calculation" : "",
  293. "type" : "",
  294. "id" : "", //特征ID
  295. "logic" : "", //特征逻辑
  296. "describe" : "", //特征信息
  297. "strategyGroupEndSign" : false,
  298. }];
  299. }
  300. this.thisIndex = index;
  301. $("#addFeatureModal").modal("show");
  302. return;
  303. }
  304. window.tempTip.setDuration(3000);
  305. window.tempTip.show(res.data.data);
  306. }).catch(err=>{
  307. window.tempTip.setDuration(3000);
  308. window.tempTip.show("网络错误:"+err);
  309. });
  310. },
  311. addFeature(){
  312. this.features.push({
  313. "strategyGroupStartSign": false,
  314. "calculation" : "",
  315. "type" : "",
  316. "id" : "", //特征ID
  317. "logic" : "", //特征逻辑
  318. "describe" : "", //特征信息
  319. "strategyGroupEndSign" : false,
  320. });
  321. },
  322. delFeature(index) {
  323. this.$delete(this.features,index);
  324. },
  325. submitFeature(){
  326. window.axios.post("{{url('maintenance/priceModel/operation/getFeature')}}",
  327. {features:this.features})
  328. .then(res=>{
  329. if (res.data.success){
  330. if (this.thisIndex == '-1') this.model.feature = res.data.data;
  331. else this.model.items[this.thisIndex].feature = res.data.data;
  332. $("#addFeatureModal").modal("hide");
  333. window.tempTip.setDuration(2000);
  334. window.tempTip.setIndex(1099);
  335. window.tempTip.showSuccess("已更新特征");
  336. return;
  337. }
  338. window.tempTip.setDuration(3000);
  339. window.tempTip.setIndex(1099);
  340. window.tempTip.show(res.data.data);
  341. }).catch(err=>{
  342. window.tempTip.setDuration(3000);
  343. window.tempTip.setIndex(1099);
  344. window.tempTip.show("网络错误:"+err);
  345. });
  346. },
  347. addDiscount(arr){
  348. this.model.items.forEach(item=>{
  349. item.discount_price.push('');
  350. });
  351. this.model.total_discount_price.push("");
  352. arr.push('');
  353. },
  354. },
  355. });
  356. </script>
  357. @stop