Accept Merge Request #126: (feature/dgg -> develop)

Merge Request: feat: 后台录入订单页面调整

Created By: @大狗哥
Accepted By: @大狗哥
URL: https://g-bcrc3009.coding.net/p/allocatr/d/allocatr/git/merge/126
This commit is contained in:
大狗哥 2025-06-08 23:03:33 +08:00 committed by Coding
commit df2113f517
8 changed files with 1265 additions and 795 deletions

View File

@ -204,11 +204,21 @@ class Order extends Backend
public function add() public function add()
{ {
if (false === $this->request->isPost()) { if (false === $this->request->isPost()) {
return $this->view->fetch(); return $this->view->fetch();
} }
$params = $this->request->post('row/a'); $params = $this->request->post('row/a');
// 数据验证
$validate = $this->validate($params, \app\admin\validate\Order::class . '.add');
if ($validate !== true) {
$this->error($validate);
}
if (!$params['set_time']) {
$params['plan_time'] = null;
}
$params = array_filter($params, function ($val) { $params = array_filter($params, function ($val) {
return $val != ''; return $val != '';
}); });
@ -249,7 +259,6 @@ class Order extends Backend
$params['update_time'] = date('Y-m-d H:i:s'); $params['update_time'] = date('Y-m-d H:i:s');
$result = $this->model->allowField(true)->save($params); $result = $this->model->allowField(true)->save($params);
if ($params['dispatch_type'] == 2) { if ($params['dispatch_type'] == 2) {
AutoDispatchLogic::autoDispatch($this->model, $this->auth); AutoDispatchLogic::autoDispatch($this->model, $this->auth);
} }
@ -288,6 +297,20 @@ class Order extends Backend
if (request()->isPost()) { if (request()->isPost()) {
// 获取表单提交的数据 // 获取表单提交的数据
$params = input('post.row/a'); $params = input('post.row/a');
// 数据验证
$validate = $this->validate($params, \app\admin\validate\Order::class . '.edit');
if ($validate !== true) {
$this->error($validate);
}
if (!$params['set_time']) {
$params['plan_time'] = null;
}
//移除无用字段:是否设置上门时间
unset($params['set_time']);
$params['update_time'] = date('Y-m-d H:i:s'); $params['update_time'] = date('Y-m-d H:i:s');
$sources = $this->sources; $sources = $this->sources;
$sources = array_column($sources, 'title', 'id'); $sources = array_column($sources, 'title', 'id');

View File

@ -10,18 +10,67 @@ class Order extends Validate
* 验证规则 * 验证规则
*/ */
protected $rule = [ protected $rule = [
'source' => 'require',
'item_id' => 'require',
'customer' => 'require|max:32',
'tel' => 'require|number|max:32',
'area_id' => 'require',
'address' => 'require|max:255',
'lng' => 'require',
'lat' => 'require',
'online_amount|收款金额' => 'require|number|between:0.01,10000000',
'plan_time|上门时间' => 'requireIf:set_time,1|date'
]; ];
/** /**
* 提示消息 * 提示消息
*/ */
protected $message = [ protected $message = [
'source.require' => '请选择订单渠道',
'item_id.require' => '请选择服务项目',
'customer.require' => '请输入客户昵称',
'customer.max' => '客户昵称不能超过 32 个字符',
'tel.require' => '请输入客户电话',
'area_id.require' => '请选择地区',
'address.require' => '请选择详细地址',
'address.max' => '详细地址不能超过 255 个字符',
'lng.require' => '请选择详细地址',
'lat.require' => '请选择详细地址',
'online_amount.require' => '请输入收款金额',
'online_amount.number' => '收款金额不正确',
]; ];
/** /**
* 验证场景 * 验证场景
*/ */
protected $scene = [ protected $scene = [
'add' => [], 'add' => [
'edit' => [], 'source',
'item_id',
'customer',
'tel',
'area_id',
'address',
'lng',
'lat',
'online_amount',
'plan_time',
],
'edit' => [
'source',
'item_id',
'customer',
'tel',
'area_id',
'address',
'lng',
'lat',
'online_amount',
'plan_time',
],
]; ];
} }

View File

@ -1,283 +1,446 @@
<div class="full-height flex-c body-hidden">
<div class="full-height"> <form id="add-form" class="row" role="form" data-toggle="validator" method="POST" action="">
<div class="overlay"></div> <!-- 遮罩层 --> <div class="ctr flex-sb">
<div class="content"> <div class="left">
<!-- 表单区域占2/3 --> <input type="hidden" name="row[dispatch_type]" value="2">
<div class="form-area"> <div class="line flex-sb">
<div> <div class="item flex-sb">
<div class="card-body"> <div class="title flex-c"><span class="required">*</span>订单渠道:</div>
<form id="add-form" class="row" role="form" data-toggle="validator" method="POST" action=""> <div class="value">
<div class="col-lg-4 col-xs-12 col-md-6"> <select id="c-source" data-live-search="true" title="请选择订单渠道" name="row[source]" class="form-control selectpicker show-tick">
<div class="form-group"> {foreach $sources as $item}
<label class="control-label col-xs-12 col-lg-4">{:__('Customer')}:</label> <option data-subtext="{$item['ptitle']}" value="{$item['id']}">{$item['title']}</option>
<div class="col-xs-12 col-sm-8"> {/foreach}
<input id="c-customer" data-rule="required" class="form-control" name="row[customer]" type="text"> </select>
</div> </div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-lg-4">{:__('Tel')}:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-tel" data-rule="required" class="form-control" name="row[tel]" type="number">
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-lg-4">{:__('Area_id')}:</label>
<div class='col-xs-12 col-sm-8'>
<input id="c-city" data-rule="required" class="form-control" data-toggle="city-picker" type="text" value="" />
<input id="area_id" style="display: none" class="form-control" name="row[area_id]" hidden type="text" value="" />
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-lg-4">{:__('Address')}:</label>
<div class="col-xs-12 col-sm-8">
<div class="myform-group">
<input id="c-address" data-rule="required"
class="form-control"
readonly
name="row[address]"
type="text">
<div class="btn btn-primary" id="area_map"
data-input-id="c-address"
data-lng-id="lng"
data-lat-id="lat">地图查找</div>
</div>
<input type="text" style="display: none"
name="row[lng]" id="lng" >
<input type="text" style="display: none"
name="row[lat]" id="lat">
<input type="text" style="display: none" id="area_name">
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-lg-4">{:__('Item_title')}:</label>
<div class="col-xs-12 col-sm-8">
<input type="text" data-rule="required" id="item_id" class="zd-input__inner">
<input type="text" id="item_id_value" style="display: none" name="row[item_id]" class="zd-input__inner">
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-lg-4">{:__('Detail')}:</label>
<div class="col-xs-12 col-sm-8">
<textarea id="c-detail" placeholder="待填" rows="8" style="width: 100%;resize: vertical" class="form-control" name="row[detail]"></textarea>
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-lg-4">上门时间:
</label>
<div class="col-xs-12 col-sm-8">
<input name="row[plan_time]" class="form-control datetimepicker">
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-lg-4">{:__('Images')}:</label>
<div class="col-xs-12 col-sm-8">
<div class="input-group">
<input id="c-images" class="form-control" size="50" name="row[images]" type="text">
<div class="input-group-addon no-border no-padding">
<span><button type="button" id="faupload-images" class="btn btn-danger faupload" data-input-id="c-images" data-mimetype="image/gif,image/jpeg,image/png,image/jpg,image/bmp,image/webp" data-multiple="true" data-preview-id="p-images"><i class="fa fa-upload"></i> {:__('Upload')}</button></span>
<span><button type="button" id="fachoose-images" class="btn btn-primary fachoose" data-input-id="c-images" data-mimetype="image/*" data-multiple="true"><i class="fa fa-list"></i> {:__('Choose')}</button></span>
</div>
<span class="msg-box n-right" for="c-images"></span>
</div>
<ul class="row list-inline faupload-preview" id="p-images"></ul>
</div>
</div>
</div>
<div class="col-lg-4 col-xs-12 col-md-6">
<div class="form-group">
<label class="control-label col-xs-12 col-lg-4">{:__('Source')}:</label>
<div class="col-xs-12 col-sm-8">
<select id="c-source" data-live-search="true" title="请选择" data-rule="required" name="row[source]" class="form-control selectpicker show-tick">
{foreach $sources as $item}
<option data-subtext="{$item['ptitle']}" value="{$item['id']}">{$item['title']}</option>
{/foreach}
</select>
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-lg-4">来源订单ID:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-source-id" name="row[source_uid]" type="text" class="form-control">
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-lg-4">派单方式:</label>
<div class="col-xs-12 col-sm-8">
<select data-live-search="true" name="row[dispatch_type]" class="form-control selectpicker show-tick">
<option value="1">手动派单</option>
<option selected value="2">自动派单</option>
</select>
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-lg-4">收款方式:</label>
<div class="col-xs-12 col-sm-8">
<select name="row[receive_type]" class="form-control selectpicker">
<option selected value="1">已收定金</option>
<option value="2">已收全款</option>
</select>
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-lg-4">收款金额:</label>
<div class="col-xs-12 col-sm-8">
<input data-rule="required" name="row[online_amount]" class="form-control" type="number">
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-lg-4">{:__('Coupons')}:</label>
<div class="col-xs-12 col-sm-8">
<select id="c-coupon" data-live-search="true" title="请选择" data-rule="required" name="row[coupon_id]" class="form-control selectpicker show-tick">
<option selected value="0">不使用优惠</option>
{foreach $coupons as $item}
<option data-subtext="{$item['description']}" value="{$item['id']}">{$item['code']}</option>
{/foreach}
</select>
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-lg-4">录单员:</label>
<div class="col-xs-12 col-sm-8">
<select id="c-users" data-live-search="true" title="不选择默认当前登陆账号" name="row[admin_id]" class="form-control selectpicker show-tick">
<option value="-1">不选择默认当前登陆账号</option>
{foreach $users as $item}
<option value="{$item['id']}">{$item['nickname']}</option>
{/foreach}
</select>
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-lg-4">{:__('Remark')}:</label>
<div class="col-xs-12 col-sm-8">
<textarea id="c-remark" placeholder="待填" rows="8" style="width: 100%;resize: vertical" class="form-control" name="row[remark]" ></textarea>
</div>
</div>
<div class="form-group col-xs-12 layer-footer text-right">
<div class="col-xs-12 col-sm-12">
<button id="mysubmit" class="btn btn-primary btn-embossed">录入并清空</button>
<button id="mybuttom" class="btn btn-primary btn-embossed">录入并保留信息</button>
</div>
</div>
</div>
<div class="col-lg-4 col-xs-12 col-md-6">
<h5 class=" col-md-12 text-left">快速输入:</h5>
<div class="col-md-12">
<div class="form-floating">
<textarea rows="8" style="width: 100%;resize: vertical" class="form-control" placeholder="复制内容,快速输入" id="smart_text"></textarea>
</div>
</div>
<div class="col-md-12 mt-2">
<button id="smart" class="btn btn-primary btn-embossed">智能识别</button>
</div>
</div>
</form>
</div>
</div>
</div> </div>
<div class="item flex-sb">
<div class="title flex-c"><span class="required">*</span>服务项目:</div>
<div class="value flex-c">
<input type="text" placeholder="请选择服务项目" id="item_id" class="zd-input__inner">
<input type="text" id="item_id_value" style="display: none" name="row[item_id]" class="zd-input__inner">
</div>
</div>
</div>
<div class="line flex-sb">
<div class="item flex-sb">
<div class="title flex-c"><span class="required">*</span>客户昵称:</div>
<div class="value flex-c">
<input id="c-customer" placeholder="请输入客户昵称" class="form-input form-control" name="row[customer]" type="text">
</div>
</div>
<div class="item flex-sb">
<div class="title flex-c"><span class="required">*</span>客户电话:</div>
<div class="value">
<input id="c-tel" placeholder="请输入客户电话" class="form-input form-control" name="row[tel]" type="number">
</div>
</div>
</div>
<div class="line flex-sb">
<div class="title flex-c"><span class="required">*</span>地区:</div>
<div class='value col-sm-12 flex-c'>
<input id="c-city" class="form-control" data-toggle="city-picker" type="text" value="" />
<input id="area_id" style="display: none" class="form-control" name="row[area_id]" hidden type="text" value="" />
</div>
</div>
<div class="line multi-line flex-sb bt-40">
<div class="select-address">
<div class="title flex-c"><span class="required">*</span>详细地址:</div>
<div class="select-ctr flex-c">
<div class="btn btn-sm btn-primary flex-c" id="area_map"
data-input-id="c-address"
data-lng-id="lng"
data-lat-id="lat">地图查找</div>
</div>
</div>
<div class='address'>
<textarea id="c-address"
class="form-control form-textarea"
readonly
placeholder="请通过地图查找选择"
name="row[address]"
type="text"></textarea>
<input type="text" style="display: none"
name="row[lng]" id="lng" >
<input type="text" style="display: none"
name="row[lat]" id="lat">
<input type="text" style="display: none" id="area_name">
</div>
</div>
<div class="line flex-sb">
<div class="item flex-sb">
<div class="title flex-c">收款方式:</div>
<div class="value flex-c">
<select name="row[receive_type]" class="form-control selectpicker">
<option selected value="1">已收定金</option>
<option value="2">已收全款</option>
</select>
</div>
</div>
<div class="item flex-sb">
<div class="title flex-c"><span class="required">*</span>收款金额:</div>
<div class="value flex-c">
<input name="row[online_amount]" class="form-control form-input" type="number" placeholder="请输入收款金额">
</div>
</div>
</div>
<div class="line flex-sb bt-40">
<div class="item flex-sb">
<div class="title flex-c">优惠:</div>
<div class="value flex-c">
<select id="c-coupon" data-live-search="true" title="请选择优惠信息" name="row[coupon_id]" class="form-control selectpicker show-tick">
<option selected value="0">不使用优惠</option>
{foreach $coupons as $item}
<option data-subtext="{$item['description']}" value="{$item['id']}">{$item['code']}</option>
{/foreach}
</select>
</div>
</div>
</div>
<div class="line flex-sb">
<div class="item flex-sb">
<div class="title flex-c">上门时间:</div>
<div class="value flex-l">
{:build_radios('row[set_time]', ['1'=>'有', '0'=>'无'], 1)}
</div>
</div>
<div class="item flex-sb" id="set-time">
<div class="title flex-c"><span class="required">*</span>设置时间:</div>
<div class="value flex-c">
<input name="row[plan_time]" placeholder="请选择上门时间" class="form-input form-control datetimepicker">
</div>
</div>
</div>
<div class="line multi-line flex-sb">
<div class="select-address">
<div class="title flex-c">订单备注:</div>
</div>
<div class='address'>
<textarea id="c-remark" placeholder="请输入订单备注" class="form-control form-textarea" name="row[remark]" ></textarea>
</div>
</div>
<div class="line flex-sb">
<div class="item flex-sb">
<div class="title flex-c">录单员:</div>
<div class="value flex-c">
<select id="c-users" data-live-search="true" title="默认当前登录账号" name="row[admin_id]" class="form-control selectpicker show-tick">
<option value="-1">默认当前登录账号</option>
{foreach $users as $item}
<option value="{$item['id']}">{$item['nickname']}</option>
{/foreach}
</select>
</div>
</div>
</div>
<div class="line flex-sb">
<div class="title flex-c">图片上传:</div>
<div class="value">
<div class="input-group">
<input id="c-images" name="row[images]" type="hidden">
<div class="input-group-addon no-border no-padding">
<span><button type="button" id="faupload-images" class="btn btn-primary faupload" data-input-id="c-images" data-mimetype="image/gif,image/jpeg,image/png,image/jpg,image/bmp,image/webp" data-multiple="true" data-preview-id="p-images"><i class="fa fa-upload"></i> {:__('Upload')}</button></span>
<span><button type="button" id="fachoose-images" class="btn btn-default fachoose" data-input-id="c-images" data-mimetype="image/*" data-multiple="true"><i class="fa fa-list"></i> {:__('Choose')}</button></span>
</div>
<span class="msg-box n-right" for="c-images"></span>
</div>
<ul class="row list-inline faupload-preview" id="p-images"></ul>
</div>
</div>
</div> </div>
<div class="right">
<div class="line flex-sb">
<div class="item flex-sb">
<div class="title flex-l">快速录入:</div>
</div>
</div>
<div class="line flex-sb smart-text-line">
<div class="item flex-sb smart-text-item">
<textarea class="form-control form-textarea smart-text" placeholder="粘贴内容,智能识别内容快速录入信息" id="smart_text"></textarea>
</div>
</div>
<div class="line flex-l">
<div id="smart" class="smart-btn flex-c custom-btn">
<img src="/assets/img/automation.png" class="img" alt="">
智能识别
</div>
</div>
</div>
<div class="submit-ctr flex-sb">
<!-- <div class="submit flex-c" id="mysubmit">录入并清空</div>-->
<!-- <div class="submit-continue flex-c" id="mybuttom">录入并保留信息</div>-->
<button id="mysubmit" class="btn btn-default submit">录入并清空</button>
<button id="mybuttom" class="btn btn-success submit-continue">录入并保留信息</button>
</div>
</div>
</form>
</div> </div>
<link rel="stylesheet" href="/assets/css/select.css"> <link rel="stylesheet" href="/assets/css/select.css">
<style> <style>
.full-height { .body-hidden {
/*height: 100vh;*/ visibility: hidden;
width: 100vw; opacity: 0;
background: #fff; }
}
.myform-group{ .body-shown {
display: flex; visibility: visible;
} opacity: 1;
.overlay { transition: opacity 0.3s ease;
position: absolute; }
top: 0;
left: 0; .flex-c {
right: 0; display: flex;
bottom: 0; justify-content: center;
background: rgba(0, 0, 0, 0.3); /* 背景黑色遮罩 */ align-items: center;
z-index: -1; }
}
.card { .flex-r {
border-radius: 10px; display: flex;
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); justify-content: flex-end;
} align-items: center;
.card-body { }
padding: 2rem;
} .flex-l {
.content { display: flex;
display: flex; justify-content: flex-start;
/*height: 100vh;*/ align-items: center;
} }
.form-area {
flex: 2; .flex-sb {
display: flex; display: flex;
justify-content: center; justify-content: space-between;
align-items: flex-start; align-items: center;
height: calc(100vh - 70px); }
overflow-y: auto; .full-height {
} width: 100vw;
.function-area { height: 768px;
flex: 1; background: #f1f4f6;
padding: 2rem; }
background-color: #f8f9fa; .ctr {
/*border-left: 1px solid #ddd;*/ width: 1000px;
} height: 768px;
.dropdown-menu { overflow: auto;
position: absolute; background: #FFFFFF;
z-index: 1000; border-radius: 8px;
width: 100%; position: relative;
max-height: 300px; }
overflow-y: auto; .ctr .left {
background-color: #fff; width: 614px;
border: 1px solid #ccc; height: 768px;
border-radius: 4px; padding: 20px 10px;
box-shadow: 0px 8px 16px rgba(0, 0, 0, 0.2); }
margin: 6px 12px; .ctr .right {
} width: 386px;
.dropdown-item { height: 768px;
padding: 8px; }
cursor: pointer;
} .line {
.suggestion-item:hover { width: 100%;
background-color: #f0f0f0; height: 40px;
} margin-bottom: 10px;
.control-label{ }
text-align: left; .line .item {
} width: 280px;
.col-xs-12{ height: 40px;
margin: 5px 0; }
position: relative;
} .title {
.msg-box{ width: 100px;
position: absolute; height: 40px;
left: 0; font-weight: 500;
top: 30px; font-size: 14px;
} color: rgba(0,0,0,0.9);
}
.title .required {
color: #E6521F;
}
.item .value {
width: 180px;
height: 40px;
}
.line>.value {
width: 494px !important;
height: 40px;
padding: 0 !important;
}
.item .value .form-input {
height: 34px !important;
color: rgba(0,0,0,0.9) !important;
border: 1px solid rgba(0,0,0,0.15) !important;
border-radius: 4px !important;
}
.value>.city-picker-span {
height: 34px !important;
border: 1px solid rgba(0,0,0,0.15) !important;
border-radius: 4px !important;
padding: 0 12px !important;
}
.value>.city-picker-span > .title > span {
color: rgba(0,0,0,0.9) !important;
font-weight: 400 !important;
}
.item .value>.bootstrap-select>.btn {
height: 34px !important;
border-radius: 4px !important;
border: 1px solid rgba(0,0,0,0.15) !important;
box-sizing: border-box !important;
background-color: #FFFFFF !important;
color: rgba(0,0,0,0.9) !important;
}
.item .value>.bootstrap-select>.btn .filter-option {
display: flex;
justify-content: flex-start;
align-items: center;
}
.item .value > .zd-input--suffix {
height: 40px !important;
line-height: 40px !important;
}
.zd-cascader-wrap>.zd-input>.zd-input__inner {
height: 34px !important;
color: rgba(0,0,0,0.9) !important;
border: 1px solid rgba(0,0,0,0.15) !important;
padding: 0 12px !important;
}
.line .select-address {
width: 100px;
height: 60px;
}
.select-address .title {
width: 100px;
height: 30px;
}
.select-address .select-ctr {
width: 100px;
height: 30px;
}
.multi-line {
height: 60px;
}
.form-textarea {
width: 494px !important;
height: 60px !important;
color: rgba(0,0,0,0.9) !important;
border: 1px solid rgba(0,0,0,0.15) !important;
border-radius: 4px !important;
resize: none;
}
#area_map {
width: 64px;
height: 26px;
border-radius: 4px;
}
.bt-40 {
margin-bottom: 40px !important;
}
.radio > label, .checkbox > label {
margin-right: 40px;
}
input[type="radio"] {
transform: scale(1.2);
}
.radio > label > input, .checkbox > label > input {
margin: 4px 0 0;
}
.faupload-preview {
padding-bottom: 20px;
}
.value .input-group {
height: 40px;
}
.right {
padding: 20px 30px;
box-sizing: border-box;
}
.smart-text,.smart-text-item,.smart-text-line {
width: 326px !important;
height: 140px !important;
}
.smart-btn {
width: 94px;
height: 38px;
background: #444c69;
border-radius: 4px;
font-weight: 400;
font-size: 14px;
color: #FFFFFF;
cursor: pointer;
user-select: none;
}
.smart-btn>.img {
width: 16px;
height: 16px;
margin-right: 2px;
}
.smart-btn:hover {
background: #3d445f;
}
.smart-btn:active {
background: #3a425b;
}
.submit-ctr {
width: 270px;
height: 80px;
position: absolute;
right: 30px;
bottom: 44px;
}
.submit-ctr> .submit {
width: 108px;
height: 46px;
box-shadow: 0px 8px 32px 0px rgba(0,0,0,0.16);
border-radius: 4px;
font-weight: 400;
font-size: 16px;
}
.submit-ctr> .submit-continue {
width: 140px;
height: 46px;
box-shadow: 0px 8px 32px 0px rgba(0,0,0,0.16);
border-radius: 4px;
font-weight: 400;
font-size: 16px;
}
</style> </style>
<script> <script>
var items = {:json_encode($items); }; var items = {:json_encode($items); };
window.addEventListener('DOMContentLoaded', function () {
setTimeout(function () {
const container = document.querySelector('.body-hidden');
if (container) {
container.classList.remove('body-hidden');
container.classList.add('body-shown');
}
}, 500);
});
</script> </script>

View File

@ -1,266 +1,369 @@
<div class="full-height flex-c body-hidden">
<div class="full-height"> <form id="add-form" class="row" role="form" data-toggle="validator" method="POST" action="{:url('order/add')}">
<div class="overlay"></div> <!-- 遮罩层 --> <div class="ctr flex-sb">
<div class="content"> <div class="left">
<!-- 表单区域占2/3 --> <input type="hidden" name="row[dispatch_type]" value="2">
<div class="form-area"> <div class="line flex-sb">
<div> <div class="item flex-sb">
<div class="card-body"> <div class="title flex-c"><span class="required">*</span>订单渠道:</div>
<form id="add-form" class="row" role="form" data-toggle="validator" method="POST" action="{:url('order/add')}"> <div class="value">
<div class="col-md-6"> <select id="c-source" data-live-search="true" title="请选择订单渠道" name="row[source]" class="form-control selectpicker show-tick">
<div class="form-group col-xs-12"> {foreach $sources as $item}
<label class="control-label col-xs-12 col-sm-3">{:__('Customer')}:</label> <option {if $item['id'] == $row.source} selected {/if} data-subtext="{$item['ptitle']}" value="{$item['id']}">{$item['title']}</option>
<div class="col-xs-12 col-sm-8"> {/foreach}
<input id="c-customer" value="{$row['customer']}" data-rule="required" class="form-control" name="row[customer]" type="text"> </select>
</div>
</div>
<div class="form-group col-xs-12">
<label class="control-label col-xs-12 col-sm-3">{:__('Tel')}:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-tel" data-rule="required" value="{$row['tel']}" class="form-control" name="row[tel]" type="number">
</div>
</div>
<div class="form-group col-xs-12">
<label class="control-label col-xs-12 col-sm-3">{:__('Area_id')}:</label>
<div class='col-xs-12 col-sm-8'>
<input id="c-city" data-rule="required" value="{$row.area_name}" class="form-control" data-toggle="city-picker" type="text" value="{$row.address}" />
<input id="area_id" style="display: none" value="{$row.area_id}" class="form-control" name="row[area_id]" hidden type="text" value="" />
</div>
</div>
<div class="form-group col-xs-12">
<label class="control-label col-xs-12 col-sm-3">{:__('Address')}:</label>
<div class="col-xs-12 col-sm-8">
<div class="myform-group">
<input id="c-address" data-rule="required"
class="form-control"
value="{$row.address}"
readonly
name="row[address]"
type="text">
<div class="btn btn-primary" id="area_map"
data-input-id="c-address"
data-lng-id="lng"
data-lat-id="lat">地图查找</div>
</div>
<input type="text" style="display: none"
name="row[lng]" value="{$row.lng}" id="lng" >
<input type="text" style="display: none"
name="row[lat]" value="{$row.lat}" id="lat">
<input type="text" style="display: none" id="area_name">
</div>
</div>
<div class="form-group col-xs-12">
<label class="control-label col-xs-12 col-sm-3">{:__('Item_title')}:</label>
<div class="col-xs-12 col-sm-8">
<input type="text" id="item_id" value="{$row.item_title}" data-value="{$row.item_title}" class="zd-input__inner">
<input type="text" id="item_id_value" value="{$row.item_id}" style="display: none" name="row[item_id]" class="zd-input__inner">
</div>
</div>
<div class="form-group col-xs-12">
<label class="control-label col-xs-12 col-sm-3">{:__('Detail')}:</label>
<div class="col-xs-12 col-sm-8">
<textarea id="c-detail" rows="8" style="width: 100%;resize: vertical" class="form-control" name="row[detail]">{$row.detail}</textarea>
</div>
</div>
<div class="form-group col-xs-12">
<label class="control-label col-xs-12 col-sm-3">上门时间:</label>
<div class="col-xs-12 col-sm-8">
<input data-rule="required" value="{$row['plan_time']}" name="row[plan_time]" class="form-control datetimepicker">
</div>
</div>
<div class="form-group col-xs-12">
<label class="control-label col-xs-12 col-sm-3">{:__('Images')}:</label>
<div class="col-xs-12 col-sm-8">
<div class="input-group">
<input id="c-images" class="form-control" size="50" name="row[images]" type="text">
<div class="input-group-addon no-border no-padding">
<span><button type="button" id="faupload-images" class="btn btn-danger faupload" data-input-id="c-images" data-mimetype="image/gif,image/jpeg,image/png,image/jpg,image/bmp,image/webp" data-multiple="true" data-preview-id="p-images"><i class="fa fa-upload"></i> {:__('Upload')}</button></span>
<span><button type="button" id="fachoose-images" class="btn btn-primary fachoose" data-input-id="c-images" data-mimetype="image/*" data-multiple="true"><i class="fa fa-list"></i> {:__('Choose')}</button></span>
</div>
<span class="msg-box n-right" for="c-images"></span>
</div>
<ul class="row list-inline faupload-preview" id="p-images"></ul>
</div>
</div>
</div>
<div class="col-md-6">
<div class="form-group col-xs-12">
<label class="control-label col-xs-12 col-sm-3">{:__('Source')}:</label>
<div class="col-xs-12 col-sm-8">
<select id="c-source" data-live-search="true" title="请选择" data-rule="required" name="row[source]" class="form-control selectpicker show-tick">
{foreach $sources as $item}
<option {if $item['id'] == $row.source} selected {/if} data-subtext="{$item['ptitle']}" value="{$item['id']}">{$item['title']}</option>
{/foreach}
</select>
</div>
</div>
<div class="form-group col-xs-12">
<label class="control-label col-xs-12 col-sm-3">来源订单ID:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-source-id" value="{$row['source_uid']}" name="row[source_uid]" type="text" class="form-control">
</div>
</div>
<div class="form-group col-xs-12">
<label class="control-label col-xs-12 col-sm-3">派单方式:</label>
<div class="col-xs-12 col-sm-8">
<select data-live-search="true" value="" name="row[dispatch_type]" class="form-control selectpicker show-tick">
<option {if 1 == $row.dispatch_type} selected {/if} value="1">手动派单</option>
<option {if 2 == $row.dispatch_type} selected {/if} value="2">自动派单</option>
</select>
</div>
</div>
<div class="form-group col-xs-12">
<label class="control-label col-xs-12 col-sm-3">收款方式:</label>
<div class="col-xs-12 col-sm-8">
<select name="row[receive_type]" class="form-control selectpicker">
<option {if 1 == $row.receive_type} selected {/if} value="1">已收定金</option>
<option {if 2 == $row.receive_type} selected {/if} value="2">已收全款</option>
</select>
</div>
</div>
<div class="form-group col-xs-12">
<label class="control-label col-xs-12 col-sm-3">收款金额:</label>
<div class="col-xs-12 col-sm-8">
<input data-rule="required" value="{$row['online_amount']}" name="row[online_amount]" class="form-control" type="number">
</div>
</div>
<div class="form-group col-xs-12">
<label class="control-label col-xs-12 col-sm-3">{:__('Coupons')}:</label>
<div class="col-xs-12 col-sm-8">
<select id="c-coupon" data-live-search="true" title="请选择" data-rule="required" name="row[coupon_id]" class="form-control selectpicker show-tick">
<option {if 0 == $row.coupon_id} selected {/if} value="0">不使用优惠</option>
{foreach $coupons as $item}
<option {if $item['id'] == $row.coupon_id} selected {/if} data-subtext="{$item['description']}" value="{$item['id']}">{$item['code']}</option>
{/foreach}
</select>
</div>
</div>
<div class="form-group col-xs-12">
<label class="control-label col-xs-12 col-sm-3">录单员:</label>
<div class="col-xs-12 col-sm-8">
<select id="c-users" data-live-search="true" title="不选择默认当前登陆账号" name="row[admin_id]" class="form-control selectpicker show-tick">
<option value="-1">不选择默认当前登陆账号</option>
{foreach $users as $item}
<option {if $item['id'] == $row.admin_id} selected {/if} value="{$item['id']}">{$item['nickname']}</option>
{/foreach}
</select>
</div>
</div>
<div class="form-group col-xs-12">
<label class="control-label col-xs-12 col-sm-3">{:__('Remark')}:</label>
<div class="col-xs-12 col-sm-8">
<textarea id="c-remark" rows="8" style="width: 100%;resize: vertical" class="form-control" name="row[remark]">{$row.remark}</textarea>
</div>
</div>
<div class="form-group col-xs-12 layer-footer">
<label class="control-label col-xs-12 col-sm-3"></label>
<div class="col-xs-12 col-sm-8">
<button type="submit" data-id="submit" class="btn btn-primary btn-embossed disabled">复制</button>
</div>
</div>
</div>
</form>
</div>
</div> </div>
</div>
<div class="item flex-sb">
<div class="title flex-c"><span class="required">*</span>服务项目:</div>
<div class="value flex-c">
<input type="text" placeholder="请选择服务项目" id="item_id" value="{$row.item_title}" data-value="{$row.item_title}" class="zd-input__inner">
<input type="text" id="item_id_value" value="{$row.item_id}" style="display: none" name="row[item_id]" class="zd-input__inner">
</div>
</div>
</div> </div>
<div class="line flex-sb">
<div class="item flex-sb">
<div class="title flex-c"><span class="required">*</span>客户昵称:</div>
<div class="value flex-c">
<input id="c-customer" placeholder="请输入客户昵称" value="{$row['customer']}" class="form-control form-input" name="row[customer]" type="text">
</div>
</div>
<div class="item flex-sb">
<div class="title flex-c"><span class="required">*</span>客户电话:</div>
<div class="value">
<input id="c-tel" value="{$row['tel']}" class="form-control form-input" name="row[tel]" type="number">
</div>
</div>
</div>
<div class="line flex-sb">
<div class="title flex-c"><span class="required">*</span>地区:</div>
<div class='value col-sm-12 flex-c'>
<input id="c-city" value="{$row.area_name}" class="form-control" data-toggle="city-picker" type="text" value="{$row.address}" />
<input id="area_id" style="display: none" value="{$row.area_id}" class="form-control" name="row[area_id]" hidden type="text" value="" />
</div>
</div>
<div class="line multi-line flex-sb bt-40">
<div class="select-address">
<div class="title flex-c"><span class="required">*</span>详细地址:</div>
<div class="select-ctr flex-c">
<div class="btn btn-sm btn-primary flex-c" id="area_map"
data-input-id="c-address"
data-lng-id="lng"
data-lat-id="lat">地图查找</div>
</div>
</div>
<div class='address'>
<textarea id="c-address"
class="form-control form-textarea"
readonly
placeholder="请通过地图查找选择"
name="row[address]"
type="text">{$row.address}</textarea>
<input type="text" style="display: none"
name="row[lng]" id="lng" value="{$row.lng}">
<input type="text" style="display: none"
name="row[lat]" id="lat" value="{$row.lat}">
<input type="text" style="display: none" id="area_name">
</div>
</div>
<div class="line flex-sb">
<div class="item flex-sb">
<div class="title flex-c">收款方式:</div>
<div class="value flex-c">
<select name="row[receive_type]" class="form-control selectpicker">
<option {if 1 == $row.receive_type} selected {/if} value="1">已收定金</option>
<option {if 2 == $row.receive_type} selected {/if} value="2">已收全款</option>
</select>
</div>
</div>
<div class="item flex-sb">
<div class="title flex-c"><span class="required">*</span>收款金额:</div>
<div class="value flex-c">
<input value="{$row['online_amount']}" placeholder="请输入收款金额" name="row[online_amount]" class="form-control form-input" type="number">
</div>
</div>
</div>
<div class="line flex-sb bt-40">
<div class="item flex-sb">
<div class="title flex-c">优惠:</div>
<div class="value flex-c">
<select id="c-coupon" data-live-search="true" title="请选择优惠信息" name="row[coupon_id]" class="form-control selectpicker show-tick">
<option {if 0 == $row.coupon_id} selected {/if} value="0">不使用优惠</option>
{foreach $coupons as $item}
<option {if $item['id'] == $row.coupon_id} selected {/if} data-subtext="{$item['description']}" value="{$item['id']}">{$item['code']}</option>
{/foreach}
</select>
</div>
</div>
</div>
<div class="line flex-sb">
<div class="item flex-sb">
<div class="title flex-c">上门时间:</div>
<div class="value flex-l">
{:build_radios('row[set_time]', ['1'=>'有', '0'=>'无'], $row.plan_time === '' || $row.plan_time === null ? 0 : 1)}
</div>
</div>
<div class="item flex-sb" id="set-time" >
<div class="title flex-c"><span class="required">*</span>设置时间:</div>
<div class="value flex-c">
<input name="row[plan_time]" value="{$row['plan_time']}" placeholder="请选择上门时间" class="form-input form-control datetimepicker">
</div>
</div>
</div>
<div class="line multi-line flex-sb">
<div class="select-address">
<div class="title flex-c">订单备注:</div>
</div>
<div class='address'>
<textarea id="c-remark" placeholder="请输入订单备注" class="form-control form-textarea" name="row[remark]" >{$row.remark}</textarea>
</div>
</div>
<div class="line flex-sb">
<div class="item flex-sb">
<div class="title flex-c">录单员:</div>
<div class="value flex-c">
<select id="c-users" data-live-search="true" title="默认当前登录账号" name="row[admin_id]" class="form-control selectpicker show-tick">
<option value="-1">不选择默认当前登陆账号</option>
{foreach $users as $item}
<option {if $item['id'] == $row.admin_id} selected {/if} value="{$item['id']}">{$item['nickname']}</option>
{/foreach}
</select>
</div>
</div>
</div>
<div class="line flex-sb">
<div class="title flex-c">图片上传:</div>
<div class="value">
<div class="input-group">
<input id="c-images" name="row[images]" value="{$row['images']}" type="hidden">
<div class="input-group-addon no-border no-padding">
<span><button type="button" id="faupload-images" class="btn btn-danger faupload" data-input-id="c-images" data-mimetype="image/gif,image/jpeg,image/png,image/jpg,image/bmp,image/webp" data-multiple="true" data-preview-id="p-images"><i class="fa fa-upload"></i> {:__('Upload')}</button></span>
<span><button type="button" id="fachoose-images" class="btn btn-primary fachoose" data-input-id="c-images" data-mimetype="image/*" data-multiple="true"><i class="fa fa-list"></i> {:__('Choose')}</button></span>
</div>
<span class="msg-box n-right" for="c-images"></span>
</div>
<ul class="row list-inline faupload-preview" id="p-images"></ul>
</div>
</div>
</div>
</div> </div>
<div class="form-group hidden layer-footer">
<label class="control-label col-xs-12 col-sm-2 col-xs-2"></label>
<div class="col-xs-12 col-sm-8">
<button type="submit" class="btn btn-primary btn-embossed disabled">复制</button>
</div>
</div>
</form>
</div> </div>
<script>
</script>
<style>
.myform-group{
display: flex;
}
.full-height {
height: 100vh;
width: 100vw;
background: #fff;
}
.overlay {
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: rgba(0, 0, 0, 0.3); /* 背景黑色遮罩 */
z-index: -1;
}
.card {
border-radius: 10px;
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
}
.card-body {
padding: 2rem;
}
.content {
display: flex;
height: 100vh;
}
.form-area {
flex: 2;
display: flex;
justify-content: center;
align-items: flex-start;
}
.function-area {
flex: 1;
padding: 2rem;
background-color: #f8f9fa;
/*border-left: 1px solid #ddd;*/
}
.dropdown-menu {
position: absolute;
z-index: 1000;
width: 100%;
max-height: 300px;
overflow-y: auto;
background-color: #fff;
border: 1px solid #ccc;
border-radius: 4px;
box-shadow: 0px 8px 16px rgba(0, 0, 0, 0.2);
margin: 6px 12px;
}
.dropdown-item {
padding: 8px;
cursor: pointer;
}
.suggestion-item:hover {
background-color: #f0f0f0;
}
</style>
<script>
var items = {:json_encode($items); };
</script>
<link rel="stylesheet" href="/assets/css/select.css"> <link rel="stylesheet" href="/assets/css/select.css">
<style>
.body-hidden {
visibility: hidden;
opacity: 0;
}
.body-shown {
visibility: visible;
opacity: 1;
transition: opacity 0.3s ease;
}
.flex-c {
display: flex;
justify-content: center;
align-items: center;
}
.flex-r {
display: flex;
justify-content: flex-end;
align-items: center;
}
.flex-l {
display: flex;
justify-content: flex-start;
align-items: center;
}
.flex-sb {
display: flex;
justify-content: space-between;
align-items: center;
}
.full-height {
width: 100vw;
height: 808px;
background: #f1f4f6;
padding-top: 20px !important;
padding-bottom: 20px !important;
}
.ctr {
width: 630px;
height: 768px;
overflow: auto;
background: #FFFFFF;
border-radius: 8px;
position: relative;
}
.ctr .left {
width: 614px;
height: 768px;
padding: 20px 10px;
}
.line {
width: 100%;
height: 40px;
margin-bottom: 10px;
}
.line .item {
width: 280px;
height: 40px;
}
.title {
width: 100px;
height: 40px;
font-weight: 500;
font-size: 14px;
color: rgba(0,0,0,0.9);
}
.title .required {
color: #E6521F;
}
.item .value {
width: 180px;
height: 40px;
}
.line>.value {
width: 494px !important;
height: 40px;
padding: 0 !important;
}
.item .value .form-input {
height: 34px !important;
color: rgba(0,0,0,0.9) !important;
border: 1px solid rgba(0,0,0,0.15) !important;
border-radius: 4px !important;
}
.value>.city-picker-span {
height: 34px !important;
border: 1px solid rgba(0,0,0,0.15) !important;
border-radius: 4px !important;
padding: 0 12px !important;
}
.value>.city-picker-span > .title > span {
color: rgba(0,0,0,0.9) !important;
font-weight: 400 !important;
}
.item .value>.bootstrap-select>.btn {
height: 34px !important;
border-radius: 4px !important;
border: 1px solid rgba(0,0,0,0.15) !important;
box-sizing: border-box !important;
background-color: #FFFFFF !important;
color: rgba(0,0,0,0.9) !important;
}
.item .value>.bootstrap-select>.btn .filter-option {
display: flex;
justify-content: flex-start;
align-items: center;
}
.item .value > .zd-input--suffix {
height: 40px !important;
line-height: 40px !important;
}
.zd-cascader-wrap>.zd-input>.zd-input__inner {
height: 34px !important;
color: rgba(0,0,0,0.9) !important;
border: 1px solid rgba(0,0,0,0.15) !important;
padding: 0 12px !important;
}
.line .select-address {
width: 100px;
height: 60px;
}
.select-address .title {
width: 100px;
height: 30px;
}
.select-address .select-ctr {
width: 100px;
height: 30px;
}
.multi-line {
height: 60px;
}
.form-textarea {
width: 494px !important;
height: 60px !important;
color: rgba(0,0,0,0.9) !important;
border: 1px solid rgba(0,0,0,0.15) !important;
border-radius: 4px !important;
resize: none;
}
#area_map {
width: 64px;
height: 26px;
border-radius: 4px;
}
.bt-40 {
margin-bottom: 40px !important;
}
.radio > label, .checkbox > label {
margin-right: 40px;
}
input[type="radio"] {
transform: scale(1.2);
}
.radio > label > input, .checkbox > label > input {
margin: 4px 0 0;
}
.faupload-preview {
padding-bottom: 20px;
}
.value .input-group {
height: 40px;
}
</style>
<script>
var items = {:json_encode($items); };
window.addEventListener('DOMContentLoaded', function () {
setTimeout(function () {
const container = document.querySelector('.body-hidden');
if (container) {
container.classList.remove('body-hidden');
container.classList.add('body-shown');
}
}, 500);
});
</script>

View File

@ -1,262 +1,368 @@
<div class="full-height flex-c body-hidden">
<div class="full-height"> <form id="add-form" class="row" role="form" data-toggle="validator" method="POST" action="">
<div class="overlay"></div> <!-- 遮罩层 --> <div class="ctr flex-sb">
<div class="content"> <div class="left">
<!-- 表单区域占2/3 --> <div class="line flex-sb">
<div class="form-area"> <div class="item flex-sb">
<div> <div class="title flex-c"><span class="required">*</span>订单渠道:</div>
<div class="card-body"> <div class="value">
<form id="add-form" class="row" role="form" data-toggle="validator" method="POST" action=""> <select id="c-source" data-live-search="true" title="请选择订单渠道" name="row[source]" class="form-control selectpicker show-tick">
<div class="col-md-6"> {foreach $sources as $item}
<div class="form-group col-xs-12"> <option {if $item['id'] == $row.source} selected {/if} data-subtext="{$item['ptitle']}" value="{$item['id']}">{$item['title']}</option>
<label class="control-label col-xs-12 col-sm-3">{:__('Customer')}:</label> {/foreach}
<div class="col-xs-12 col-sm-8"> </select>
<input id="c-customer" value="{$row['customer']}" data-rule="required" class="form-control" name="row[customer]" type="text">
</div>
</div>
<div class="form-group col-xs-12">
<label class="control-label col-xs-12 col-sm-3">{:__('Tel')}:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-tel" data-rule="required" value="{$row['tel']}" class="form-control" name="row[tel]" type="number">
</div>
</div>
<div class="form-group col-xs-12">
<label class="control-label col-xs-12 col-sm-3">{:__('Area_id')}:</label>
<div class='col-xs-12 col-sm-8'>
<input id="c-city" data-rule="required" value="{$row.area_name}" class="form-control" data-toggle="city-picker" type="text" value="{$row.address}" />
<input id="area_id" style="display: none" value="{$row.area_id}" class="form-control" name="row[area_id]" hidden type="text" value="" />
</div>
</div>
<div class="form-group col-xs-12">
<label class="control-label col-xs-12 col-sm-3">{:__('Address')}:</label>
<div class="col-xs-12 col-sm-8">
<div class="myform-group">
<input id="c-address" data-rule="required"
class="form-control"
value="{$row.address}"
readonly
name="row[address]"
type="text">
<div class="btn btn-primary" id="area_map"
data-input-id="c-address"
data-lng-id="lng"
data-lat-id="lat">地图查找</div>
</div>
<input type="text" style="display: none"
name="row[lng]" id="lng" >
<input type="text" style="display: none"
name="row[lat]" id="lat">
<input type="text" style="display: none" id="area_name">
</div>
</div>
<div class="form-group col-xs-12">
<label class="control-label col-xs-12 col-sm-3">{:__('Item_title')}:</label>
<div class="col-xs-12 col-sm-8">
<input type="text" data-rule="required" id="item_id" value="{$row.item_title}" data-value="{$row.item_title}" class="zd-input__inner">
<input type="text" id="item_id_value" value="{$row.item_id}" style="display: none" name="row[item_id]" class="zd-input__inner">
</div>
</div>
<div class="form-group col-xs-12">
<label class="control-label col-xs-12 col-sm-3">{:__('Detail')}:</label>
<div class="col-xs-12 col-sm-8">
<textarea id="c-detail" rows="8" style="width: 100%;resize: vertical" class="form-control" name="row[detail]">{$row.detail}</textarea>
</div>
</div>
<div class="form-group col-xs-12">
<label class="control-label col-xs-12 col-sm-3">上门时间:</label>
<div class="col-xs-12 col-sm-8">
<input data-rule="required" value="{$row['plan_time']}" name="row[plan_time]" class="form-control datetimepicker">
</div>
</div>
<div class="form-group col-xs-12">
<label class="control-label col-xs-12 col-sm-3">{:__('Images')}:</label>
<div class="col-xs-12 col-sm-8">
<div class="input-group">
<input id="c-images" class="form-control" size="50" name="row[images]" type="text">
<div class="input-group-addon no-border no-padding">
<span><button type="button" id="faupload-images" class="btn btn-danger faupload" data-input-id="c-images" data-mimetype="image/gif,image/jpeg,image/png,image/jpg,image/bmp,image/webp" data-multiple="true" data-preview-id="p-images"><i class="fa fa-upload"></i> {:__('Upload')}</button></span>
<span><button type="button" id="fachoose-images" class="btn btn-primary fachoose" data-input-id="c-images" data-mimetype="image/*" data-multiple="true"><i class="fa fa-list"></i> {:__('Choose')}</button></span>
</div>
<span class="msg-box n-right" for="c-images"></span>
</div>
<ul class="row list-inline faupload-preview" id="p-images"></ul>
</div>
</div>
</div>
<div class="col-md-6">
<div class="form-group col-xs-12">
<label class="control-label col-xs-12 col-sm-3">{:__('Source')}:</label>
<div class="col-xs-12 col-sm-8">
<select id="c-source" data-live-search="true" title="请选择" data-rule="required" name="row[source]" class="form-control selectpicker show-tick">
{foreach $sources as $item}
<option {if $item['id'] == $row.source} selected {/if} data-subtext="{$item['ptitle']}" value="{$item['id']}">{$item['title']}</option>
{/foreach}
</select>
</div>
</div>
<div class="form-group col-xs-12">
<label class="control-label col-xs-12 col-sm-3">来源订单ID:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-source-id" value="{$row['source_uid']}" name="row[source_uid]" type="text" class="form-control">
</div>
</div>
<div class="form-group col-xs-12">
<label class="control-label col-xs-12 col-sm-3">派单方式:</label>
<div class="col-xs-12 col-sm-8">
<select data-live-search="true" value="" name="row[dispatch_type]" class="form-control selectpicker show-tick">
<option {if 1 == $row.dispatch_type} selected {/if} value="1">手动派单</option>
<option {if 2 == $row.dispatch_type} selected {/if} value="2">自动派单</option>
</select>
</div>
</div>
<div class="form-group col-xs-12">
<label class="control-label col-xs-12 col-sm-3">收款方式:</label>
<div class="col-xs-12 col-sm-8">
<select name="row[receive_type]" class="form-control selectpicker">
<option {if 1 == $row.receive_type} selected {/if} value="1">已收定金</option>
<option {if 2 == $row.receive_type} selected {/if} value="2">已收全款</option>
</select>
</div>
</div>
<div class="form-group col-xs-12">
<label class="control-label col-xs-12 col-sm-3">收款金额:</label>
<div class="col-xs-12 col-sm-8">
<input data-rule="required" value="{$row['online_amount']}" name="row[online_amount]" class="form-control" type="number">
</div>
</div>
<div class="form-group col-xs-12">
<label class="control-label col-xs-12 col-sm-3">{:__('Coupons')}:</label>
<div class="col-xs-12 col-sm-8">
<select id="c-coupon" data-live-search="true" title="请选择" data-rule="required" name="row[coupon_id]" class="form-control selectpicker show-tick">
<option {if 0 == $row.coupon_id} selected {/if} value="0">不使用优惠</option>
{foreach $coupons as $item}
<option {if $item['id'] == $row.coupon_id} selected {/if} data-subtext="{$item['description']}" value="{$item['id']}">{$item['code']}</option>
{/foreach}
</select>
</div>
</div>
<div class="form-group col-xs-12">
<label class="control-label col-xs-12 col-sm-3">录单员:</label>
<div class="col-xs-12 col-sm-8">
<select id="c-users" data-live-search="true" title="不选择默认当前登陆账号" name="row[admin_id]" class="form-control selectpicker show-tick">
<option value="-1">不选择默认当前登陆账号</option>
{foreach $users as $item}
<option {if $item['id'] == $row.admin_id} selected {/if} value="{$item['id']}">{$item['nickname']}</option>
{/foreach}
</select>
</div>
</div>
<div class="form-group col-xs-12">
<label class="control-label col-xs-12 col-sm-3">{:__('Remark')}:</label>
<div class="col-xs-12 col-sm-8">
<textarea id="c-remark" rows="8" style="width: 100%;resize: vertical" class="form-control" name="row[remark]">{$row.remark}</textarea>
</div>
</div>
<div class="form-group col-xs-12 layer-footer">
<label class="control-label col-xs-12 col-sm-3"></label>
<div class="col-xs-12 col-sm-8">
<button type="submit" data-id="submit" class="btn btn-primary btn-embossed disabled">修改</button>
</div>
</div>
</div>
</form>
</div>
</div> </div>
</div>
<div class="item flex-sb">
<div class="title flex-c"><span class="required">*</span>服务项目:</div>
<div class="value flex-c">
<input type="text" placeholder="请选择服务项目" id="item_id" value="{$row.item_title}" data-value="{$row.item_title}" class="zd-input__inner">
<input type="text" id="item_id_value" value="{$row.item_id}" style="display: none" name="row[item_id]" class="zd-input__inner">
</div>
</div>
</div> </div>
<div class="line flex-sb">
<div class="item flex-sb">
<div class="title flex-c"><span class="required">*</span>客户昵称:</div>
<div class="value flex-c">
<input id="c-customer" placeholder="请输入客户昵称" value="{$row['customer']}" class="form-control form-input" name="row[customer]" type="text">
</div>
</div>
<div class="item flex-sb">
<div class="title flex-c"><span class="required">*</span>客户电话:</div>
<div class="value">
<input id="c-tel" value="{$row['tel']}" class="form-control form-input" name="row[tel]" type="number">
</div>
</div>
</div>
<div class="line flex-sb">
<div class="title flex-c"><span class="required">*</span>地区:</div>
<div class='value col-sm-12 flex-c'>
<input id="c-city" value="{$row.area_name}" class="form-control" data-toggle="city-picker" type="text" value="{$row.address}" />
<input id="area_id" style="display: none" value="{$row.area_id}" class="form-control" name="row[area_id]" hidden type="text" value="" />
</div>
</div>
<div class="line multi-line flex-sb bt-40">
<div class="select-address">
<div class="title flex-c"><span class="required">*</span>详细地址:</div>
<div class="select-ctr flex-c">
<div class="btn btn-sm btn-primary flex-c" id="area_map"
data-input-id="c-address"
data-lng-id="lng"
data-lat-id="lat">地图查找</div>
</div>
</div>
<div class='address'>
<textarea id="c-address"
class="form-control form-textarea"
readonly
placeholder="请通过地图查找选择"
name="row[address]"
type="text">{$row.address}</textarea>
<input type="text" style="display: none"
name="row[lng]" id="lng" value="{$row.lng}">
<input type="text" style="display: none"
name="row[lat]" id="lat" value="{$row.lat}">
<input type="text" style="display: none" id="area_name">
</div>
</div>
<div class="line flex-sb">
<div class="item flex-sb">
<div class="title flex-c">收款方式:</div>
<div class="value flex-c">
<select name="row[receive_type]" class="form-control selectpicker">
<option {if 1 == $row.receive_type} selected {/if} value="1">已收定金</option>
<option {if 2 == $row.receive_type} selected {/if} value="2">已收全款</option>
</select>
</div>
</div>
<div class="item flex-sb">
<div class="title flex-c"><span class="required">*</span>收款金额:</div>
<div class="value flex-c">
<input value="{$row['online_amount']}" placeholder="请输入收款金额" name="row[online_amount]" class="form-control form-input" type="number">
</div>
</div>
</div>
<div class="line flex-sb bt-40">
<div class="item flex-sb">
<div class="title flex-c">优惠:</div>
<div class="value flex-c">
<select id="c-coupon" data-live-search="true" title="请选择优惠信息" name="row[coupon_id]" class="form-control selectpicker show-tick">
<option {if 0 == $row.coupon_id} selected {/if} value="0">不使用优惠</option>
{foreach $coupons as $item}
<option {if $item['id'] == $row.coupon_id} selected {/if} data-subtext="{$item['description']}" value="{$item['id']}">{$item['code']}</option>
{/foreach}
</select>
</div>
</div>
</div>
<div class="line flex-sb">
<div class="item flex-sb">
<div class="title flex-c">上门时间:</div>
<div class="value flex-l">
{:build_radios('row[set_time]', ['1'=>'有', '0'=>'无'], $row.plan_time === '' || $row.plan_time === null ? 0 : 1)}
</div>
</div>
<div class="item flex-sb" id="set-time" >
<div class="title flex-c"><span class="required">*</span>设置时间:</div>
<div class="value flex-c">
<input name="row[plan_time]" value="{$row['plan_time']}" placeholder="请选择上门时间" class="form-input form-control datetimepicker">
</div>
</div>
</div>
<div class="line multi-line flex-sb">
<div class="select-address">
<div class="title flex-c">订单备注:</div>
</div>
<div class='address'>
<textarea id="c-remark" placeholder="请输入订单备注" class="form-control form-textarea" name="row[remark]" >{$row.remark}</textarea>
</div>
</div>
<div class="line flex-sb">
<div class="item flex-sb">
<div class="title flex-c">录单员:</div>
<div class="value flex-c">
<select id="c-users" data-live-search="true" title="默认当前登录账号" name="row[admin_id]" class="form-control selectpicker show-tick">
<option value="-1">不选择默认当前登陆账号</option>
{foreach $users as $item}
<option {if $item['id'] == $row.admin_id} selected {/if} value="{$item['id']}">{$item['nickname']}</option>
{/foreach}
</select>
</div>
</div>
</div>
<div class="line flex-sb">
<div class="title flex-c">图片上传:</div>
<div class="value">
<div class="input-group">
<input id="c-images" name="row[images]" value="{$row['images']}" type="hidden">
<div class="input-group-addon no-border no-padding">
<span><button type="button" id="faupload-images" class="btn btn-danger faupload" data-input-id="c-images" data-mimetype="image/gif,image/jpeg,image/png,image/jpg,image/bmp,image/webp" data-multiple="true" data-preview-id="p-images"><i class="fa fa-upload"></i> {:__('Upload')}</button></span>
<span><button type="button" id="fachoose-images" class="btn btn-primary fachoose" data-input-id="c-images" data-mimetype="image/*" data-multiple="true"><i class="fa fa-list"></i> {:__('Choose')}</button></span>
</div>
<span class="msg-box n-right" for="c-images"></span>
</div>
<ul class="row list-inline faupload-preview" id="p-images"></ul>
</div>
</div>
</div>
</div> </div>
<div class="form-group hidden layer-footer">
<label class="control-label col-xs-12 col-sm-2 col-xs-2"></label>
<div class="col-xs-12 col-sm-8">
<button type="submit" class="btn btn-primary btn-embossed disabled">修改</button>
</div>
</div>
</form>
</div> </div>
<script>
</script>
<style>
.myform-group{
display: flex;
}
.full-height {
height: 100vh;
width: 100vw;
background: #fff;
}
.overlay {
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: rgba(0, 0, 0, 0.3); /* 背景黑色遮罩 */
z-index: -1;
}
.card {
border-radius: 10px;
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
}
.card-body {
padding: 2rem;
}
.content {
display: flex;
height: 100vh;
}
.form-area {
flex: 2;
display: flex;
justify-content: center;
align-items: flex-start;
}
.function-area {
flex: 1;
padding: 2rem;
background-color: #f8f9fa;
/*border-left: 1px solid #ddd;*/
}
.dropdown-menu {
position: absolute;
z-index: 1000;
width: 100%;
max-height: 300px;
overflow-y: auto;
background-color: #fff;
border: 1px solid #ccc;
border-radius: 4px;
box-shadow: 0px 8px 16px rgba(0, 0, 0, 0.2);
margin: 6px 12px;
}
.dropdown-item {
padding: 8px;
cursor: pointer;
}
.suggestion-item:hover {
background-color: #f0f0f0;
}
</style>
<script>
var items = {:json_encode($items); };
</script>
<link rel="stylesheet" href="/assets/css/select.css"> <link rel="stylesheet" href="/assets/css/select.css">
<style>
.body-hidden {
visibility: hidden;
opacity: 0;
}
.body-shown {
visibility: visible;
opacity: 1;
transition: opacity 0.3s ease;
}
.flex-c {
display: flex;
justify-content: center;
align-items: center;
}
.flex-r {
display: flex;
justify-content: flex-end;
align-items: center;
}
.flex-l {
display: flex;
justify-content: flex-start;
align-items: center;
}
.flex-sb {
display: flex;
justify-content: space-between;
align-items: center;
}
.full-height {
width: 100vw;
height: 808px;
background: #f1f4f6;
padding-top: 20px !important;
padding-bottom: 20px !important;
}
.ctr {
width: 630px;
height: 768px;
overflow: auto;
background: #FFFFFF;
border-radius: 8px;
position: relative;
}
.ctr .left {
width: 614px;
height: 768px;
padding: 20px 10px;
}
.line {
width: 100%;
height: 40px;
margin-bottom: 10px;
}
.line .item {
width: 280px;
height: 40px;
}
.title {
width: 100px;
height: 40px;
font-weight: 500;
font-size: 14px;
color: rgba(0,0,0,0.9);
}
.title .required {
color: #E6521F;
}
.item .value {
width: 180px;
height: 40px;
}
.line>.value {
width: 494px !important;
height: 40px;
padding: 0 !important;
}
.item .value .form-input {
height: 34px !important;
color: rgba(0,0,0,0.9) !important;
border: 1px solid rgba(0,0,0,0.15) !important;
border-radius: 4px !important;
}
.value>.city-picker-span {
height: 34px !important;
border: 1px solid rgba(0,0,0,0.15) !important;
border-radius: 4px !important;
padding: 0 12px !important;
}
.value>.city-picker-span > .title > span {
color: rgba(0,0,0,0.9) !important;
font-weight: 400 !important;
}
.item .value>.bootstrap-select>.btn {
height: 34px !important;
border-radius: 4px !important;
border: 1px solid rgba(0,0,0,0.15) !important;
box-sizing: border-box !important;
background-color: #FFFFFF !important;
color: rgba(0,0,0,0.9) !important;
}
.item .value>.bootstrap-select>.btn .filter-option {
display: flex;
justify-content: flex-start;
align-items: center;
}
.item .value > .zd-input--suffix {
height: 40px !important;
line-height: 40px !important;
}
.zd-cascader-wrap>.zd-input>.zd-input__inner {
height: 34px !important;
color: rgba(0,0,0,0.9) !important;
border: 1px solid rgba(0,0,0,0.15) !important;
padding: 0 12px !important;
}
.line .select-address {
width: 100px;
height: 60px;
}
.select-address .title {
width: 100px;
height: 30px;
}
.select-address .select-ctr {
width: 100px;
height: 30px;
}
.multi-line {
height: 60px;
}
.form-textarea {
width: 494px !important;
height: 60px !important;
color: rgba(0,0,0,0.9) !important;
border: 1px solid rgba(0,0,0,0.15) !important;
border-radius: 4px !important;
resize: none;
}
#area_map {
width: 64px;
height: 26px;
border-radius: 4px;
}
.bt-40 {
margin-bottom: 40px !important;
}
.radio > label, .checkbox > label {
margin-right: 40px;
}
input[type="radio"] {
transform: scale(1.2);
}
.radio > label > input, .checkbox > label > input {
margin: 4px 0 0;
}
.faupload-preview {
padding-bottom: 20px;
}
.value .input-group {
height: 40px;
}
</style>
<script>
var items = {:json_encode($items); };
window.addEventListener('DOMContentLoaded', function () {
setTimeout(function () {
const container = document.querySelector('.body-hidden');
if (container) {
container.classList.remove('body-hidden');
container.classList.add('body-shown');
}
}, 500);
});
</script>

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

View File

@ -1,7 +1,6 @@
define([], function () { define([], function () {
require([], function () { require([], function () {
//绑定data-toggle=addresspicker属性点击事件 //绑定data-toggle=addresspicker属性点击事件
$(document).on('click', "[data-toggle='addresspicker']", function () { $(document).on('click', "[data-toggle='addresspicker']", function () {
var that = this; var that = this;
var callback = $(that).data('callback'); var callback = $(that).data('callback');

View File

@ -424,6 +424,7 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form', 'cascader'], function
} }
return false; return false;
}); });
$("#mysubmit").on("click", function () { $("#mysubmit").on("click", function () {
const res = $("form[role=form]").isValid(); const res = $("form[role=form]").isValid();
if (res){ if (res){
@ -433,7 +434,7 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form', 'cascader'], function
} }
return false; return false;
}); });
Form.api.bindevent($("form[role=form]"));
$("#smart").on("click", function () { $("#smart").on("click", function () {
$.ajax({ $.ajax({
url: "order/smart", // 你的 API 地址 url: "order/smart", // 你的 API 地址
@ -478,13 +479,30 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form', 'cascader'], function
} }
}); });
}); });
Controller.api.bindevent();
Controller.api.map(); Controller.api.map();
}, },
edit: function () { edit: function () {
// 未选择上门时间时,隐藏时间选择框
var planTime = $('input[name="row[plan_time]"]').val()
if (planTime === '' || planTime === 'null') {
$('#set-time').hide();
} else {
$('#set-time').show();
}
Controller.api.bindevent(); Controller.api.bindevent();
Controller.api.map(); Controller.api.map();
}, },
copy: function () { copy: function () {
// 未选择上门时间时,隐藏时间选择框
var planTime = $('input[name="row[plan_time]"]').val()
if (planTime === '' || planTime === 'null') {
$('#set-time').hide();
} else {
$('#set-time').show();
}
Controller.api.bindevent(); Controller.api.bindevent();
Controller.api.map(); Controller.api.map();
}, },
@ -531,6 +549,15 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form', 'cascader'], function
api: { api: {
bindevent: function () { bindevent: function () {
Form.api.bindevent($("form[role=form]")); Form.api.bindevent($("form[role=form]"));
$('input[name="row[set_time]"]').on('change', function () {
var val = $(this).val();
if (val == 1) {
$('#set-time').show();
} else {
$('#set-time').hide();
}
});
}, },
map:function () { map:function () {
$("#c-city").on("cp:updated", function () { $("#c-city").on("cp:updated", function () {