Merge remote-tracking branch 'origin/develop' into develop
This commit is contained in:
commit
779888ec07
|
|
@ -70,7 +70,7 @@ return [
|
||||||
'title' => '高德地图KEY',
|
'title' => '高德地图KEY',
|
||||||
'type' => 'string',
|
'type' => 'string',
|
||||||
'content' => [],
|
'content' => [],
|
||||||
'value' => 'dd4e8434697466586aaac37167abfb52',
|
'value' => 'cc6b0958c512ac08b0aa884f9b64d553',
|
||||||
'rule' => '',
|
'rule' => '',
|
||||||
'msg' => '',
|
'msg' => '',
|
||||||
'tip' => '',
|
'tip' => '',
|
||||||
|
|
@ -82,7 +82,7 @@ return [
|
||||||
'title' => '高德地图安全密钥',
|
'title' => '高德地图安全密钥',
|
||||||
'type' => 'string',
|
'type' => 'string',
|
||||||
'content' => [],
|
'content' => [],
|
||||||
'value' => '38b7b7a5e4b90dcb1aa4999826d4e9d1',
|
'value' => 'a2ac54e925b448f8884e35ead370c12d',
|
||||||
'rule' => '',
|
'rule' => '',
|
||||||
'msg' => '',
|
'msg' => '',
|
||||||
'tip' => '',
|
'tip' => '',
|
||||||
|
|
|
||||||
|
|
@ -44,8 +44,8 @@ class Index extends Controller
|
||||||
{
|
{
|
||||||
$config = get_addon_config('address');
|
$config = get_addon_config('address');
|
||||||
$zoom = (int)$this->request->get('zoom', $config['zoom']);
|
$zoom = (int)$this->request->get('zoom', $config['zoom']);
|
||||||
$lng = (float)$this->request->get('lng');
|
$lng = $this->request->get('lng');
|
||||||
$lat = (float)$this->request->get('lat');
|
$lat = $this->request->get('lat');
|
||||||
$address = $this->request->get('address');
|
$address = $this->request->get('address');
|
||||||
$city_code = $this->request->get('city_code');
|
$city_code = $this->request->get('city_code');
|
||||||
$lng = $lng ?: $config['lng'];
|
$lng = $lng ?: $config['lng'];
|
||||||
|
|
|
||||||
|
|
@ -111,7 +111,7 @@
|
||||||
var center = [lng,lat]
|
var center = [lng,lat]
|
||||||
//加载PositionPicker,loadUI的路径参数为模块名中 'ui/' 之后的部分
|
//加载PositionPicker,loadUI的路径参数为模块名中 'ui/' 之后的部分
|
||||||
|
|
||||||
console.log(center)
|
// console.log(center)
|
||||||
map = new AMap.Map('container', {
|
map = new AMap.Map('container', {
|
||||||
zoom: parseInt('{$zoom}'),
|
zoom: parseInt('{$zoom}'),
|
||||||
center: center
|
center: center
|
||||||
|
|
@ -121,15 +121,15 @@
|
||||||
radius: 1000, //范围,默认:500,
|
radius: 1000, //范围,默认:500,
|
||||||
});
|
});
|
||||||
if (city_code){
|
if (city_code){
|
||||||
// console.log(111,city_code);
|
// // console.log(111,city_code);
|
||||||
geocoder.getLocation(city_code, function(status, result) {
|
geocoder.getLocation(city_code, function(status, result) {
|
||||||
if (status === 'complete' && result.info === 'OK') {
|
if (status === 'complete' && result.info === 'OK') {
|
||||||
lat = result.geocodes[0].location.lat;
|
lat = result.geocodes[0].location.lat;
|
||||||
lng = result.geocodes[0].location.lng;
|
lng = result.geocodes[0].location.lng;
|
||||||
map.setCenter(result.geocodes[0].location);
|
map.setCenter(result.geocodes[0].location);
|
||||||
console.log(result.geocodes[0],2222);
|
// console.log(result.geocodes[0],2222,result);
|
||||||
} else {
|
} else {
|
||||||
console.log(result)
|
// console.log(result)
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
@ -147,6 +147,7 @@
|
||||||
lat = lnglat.lat;
|
lat = lnglat.lat;
|
||||||
map.panTo([lng, lat]);
|
map.panTo([lng, lat]);
|
||||||
positionPicker.start(lnglat);
|
positionPicker.start(lnglat);
|
||||||
|
// console.log(lnglat,addr)
|
||||||
if (addr) {
|
if (addr) {
|
||||||
// var label = '<div class="info">地址:' + addr + '<br>经度:' + lng + '<br>纬度:' + lat + '</div>';
|
// var label = '<div class="info">地址:' + addr + '<br>经度:' + lng + '<br>纬度:' + lat + '</div>';
|
||||||
var label = '<div class="info">地址:' + addr + '</div>';
|
var label = '<div class="info">地址:' + addr + '</div>';
|
||||||
|
|
@ -159,11 +160,12 @@
|
||||||
var address = result.regeocode.formattedAddress;
|
var address = result.regeocode.formattedAddress;
|
||||||
// var label = '<div class="info">地址:' + address + '<br>经度:' + lng + '<br>纬度:' + lat + '</div>';
|
// var label = '<div class="info">地址:' + address + '<br>经度:' + lng + '<br>纬度:' + lat + '</div>';
|
||||||
var label = '<div class="info">地址:' + address + '</div>';
|
var label = '<div class="info">地址:' + address + '</div>';
|
||||||
|
city_code = result.regeocode.addressComponent.adcode
|
||||||
positionPicker.marker.setLabel({
|
positionPicker.marker.setLabel({
|
||||||
content: label //显示内容
|
content: label //显示内容
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
console.log(JSON.stringify(result));
|
// console.log(JSON.stringify(result));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
@ -211,7 +213,7 @@
|
||||||
});
|
});
|
||||||
|
|
||||||
positionPicker.on('success', function (positionResult) {
|
positionPicker.on('success', function (positionResult) {
|
||||||
console.log(positionResult);
|
// console.log(positionResult);
|
||||||
as = positionResult.position;
|
as = positionResult.position;
|
||||||
address = positionResult.address;
|
address = positionResult.address;
|
||||||
lat = as.lat;
|
lat = as.lat;
|
||||||
|
|
@ -260,12 +262,13 @@
|
||||||
//点击搜索按钮
|
//点击搜索按钮
|
||||||
$(document).on('click', '.confirm', function () {
|
$(document).on('click', '.confirm', function () {
|
||||||
var zoom = map.getZoom();
|
var zoom = map.getZoom();
|
||||||
var data = {lat: lat, lng: lng, zoom: zoom, address: address};
|
// console.log(map)
|
||||||
|
var data = {lat: lat, lng: lng, zoom: zoom, address: address,city_code:city_code};
|
||||||
if (fromtype !== totype) {
|
if (fromtype !== totype) {
|
||||||
var result = gcoord.transform([data.lng, data.lat], gcoord[fromtype], gcoord[totype]);
|
var result = gcoord.transform([data.lng, data.lat], gcoord[fromtype], gcoord[totype]);
|
||||||
data.lng = (result[0] || data.lng).toFixed(5);
|
data.lng = (result[0] || data.lng).toFixed(5);
|
||||||
data.lat = (result[1] || data.lat).toFixed(5);
|
data.lat = (result[1] || data.lat).toFixed(5);
|
||||||
console.log(data, result, fromtype, totype);
|
// console.log(data, result, fromtype, totype);
|
||||||
}
|
}
|
||||||
close(data);
|
close(data);
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -18,11 +18,12 @@ class Address
|
||||||
$name_items [] = $item->title;
|
$name_items [] = $item->title;
|
||||||
$name_items_map [$item->title] = $item->id;
|
$name_items_map [$item->title] = $item->id;
|
||||||
}
|
}
|
||||||
$type = self::findMostSimilar($string,$name_items);
|
|
||||||
$type_arr = explode('__',$type);
|
$titles = Item::where('status',1)->column('title');
|
||||||
$type = $type_arr[0] ?? '';
|
$type = self::extractServiceTypes($string,$titles)[0] ?? '';
|
||||||
$str = $type_arr[1] ?? '';
|
|
||||||
$string = str_replace($str,'',$string);
|
|
||||||
|
$string = str_replace($type,'',$string);
|
||||||
if ($user) {
|
if ($user) {
|
||||||
$decompose = self::decompose($string);
|
$decompose = self::decompose($string);
|
||||||
$re = $decompose;
|
$re = $decompose;
|
||||||
|
|
@ -34,9 +35,9 @@ class Address
|
||||||
$fuzz = self::fuzz($re['addr']);
|
$fuzz = self::fuzz($re['addr']);
|
||||||
$parse = self::parse($fuzz['a1'], $fuzz['a2'], $fuzz['a3']);
|
$parse = self::parse($fuzz['a1'], $fuzz['a2'], $fuzz['a3']);
|
||||||
|
|
||||||
$re['province'] = $parse['province'];
|
$re['province'] = $parse['province'] ?? '';
|
||||||
$re['city'] = $parse['city'];
|
$re['city'] = $parse['city'] ?? '';
|
||||||
$re['region'] = $parse['region'];
|
$re['region'] = $parse['region'] ?? '';
|
||||||
$re['item'] = [
|
$re['item'] = [
|
||||||
'id'=> $name_items_map[$type] ?? 0,
|
'id'=> $name_items_map[$type] ?? 0,
|
||||||
'item' => $type ?? ''
|
'item' => $type ?? ''
|
||||||
|
|
@ -305,4 +306,38 @@ class Address
|
||||||
|
|
||||||
return $r;
|
return $r;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 从聊天内容中提取匹配的服务类型
|
||||||
|
*
|
||||||
|
* @param string $chatText 聊天内容
|
||||||
|
* @param array $serviceTypes 服务类型数组
|
||||||
|
* @param bool $returnAll 是否返回全部匹配,false 时只返回第一个匹配
|
||||||
|
* @return array|string|null 匹配的服务类型(数组或单个字符串)
|
||||||
|
*/
|
||||||
|
static function extractServiceTypes(string $chatText, array $serviceTypes, bool $returnAll = true): array|string|null
|
||||||
|
{
|
||||||
|
// 去重 + 去空
|
||||||
|
$cleaned = array_filter(array_map('trim', $serviceTypes));
|
||||||
|
|
||||||
|
// 优先匹配更长的词
|
||||||
|
usort($cleaned, fn($a, $b) => mb_strlen($b, 'UTF-8') - mb_strlen($a, 'UTF-8'));
|
||||||
|
|
||||||
|
$matched = [];
|
||||||
|
|
||||||
|
foreach ($cleaned as $service) {
|
||||||
|
if (mb_stripos($chatText, $service) !== false) {
|
||||||
|
if ($returnAll) {
|
||||||
|
$matched[] = $service;
|
||||||
|
} else {
|
||||||
|
return $service;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $returnAll ? $matched : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -11,6 +11,7 @@ use app\admin\model\OrderDispatch;
|
||||||
use app\admin\model\OrderReview;
|
use app\admin\model\OrderReview;
|
||||||
use app\admin\model\Worker;
|
use app\admin\model\Worker;
|
||||||
use app\admin\model\WorkerItem;
|
use app\admin\model\WorkerItem;
|
||||||
|
use app\admin\controller\AmapTrait;
|
||||||
use think\Collection;
|
use think\Collection;
|
||||||
use think\console\Command;
|
use think\console\Command;
|
||||||
use think\console\Input;
|
use think\console\Input;
|
||||||
|
|
@ -24,7 +25,7 @@ use function Symfony\Component\Clock\now;
|
||||||
|
|
||||||
class Test extends Command
|
class Test extends Command
|
||||||
{
|
{
|
||||||
|
use AmapTrait;
|
||||||
|
|
||||||
protected function configure()
|
protected function configure()
|
||||||
{
|
{
|
||||||
|
|
@ -34,38 +35,9 @@ class Test extends Command
|
||||||
|
|
||||||
protected function execute(Input $input, Output $output)
|
protected function execute(Input $input, Output $output)
|
||||||
{
|
{
|
||||||
dd(config('system_id'));
|
$key = 'ae0ab397a2febfa1ce0a2c780f3f23a3';
|
||||||
|
$res = $this->getAddressByKeyword('重庆武隆区凤山街道锦江竹苑6幢31-4');
|
||||||
$order = Order::where('id',140)->find();
|
|
||||||
AutoDispatchLogic::autoDispatch($order);
|
|
||||||
|
|
||||||
|
|
||||||
$hookParams = [
|
|
||||||
'dispatch' => (new OrderDispatch())->where('id', 144)->find(),
|
|
||||||
'remark' => '系统自动派单给师傅:'. '时间嗯' .'('.'12312'.')',
|
|
||||||
];
|
|
||||||
|
|
||||||
Lang::load(APP_PATH . 'admin/lang/zh-cn/orders/dispatch2.php');
|
|
||||||
|
|
||||||
$Model = new \app\admin\model\OrderDispatch();
|
|
||||||
$statusList = $Model->getStatusList();
|
|
||||||
$dispatch = $hookParams['dispatch']; //订单对象
|
|
||||||
$remark = $hookParams['remark'] ?? ''; //备注
|
|
||||||
$data = [
|
|
||||||
'dispatch_id' => $dispatch->id,
|
|
||||||
'order_id' => $dispatch->order_id,
|
|
||||||
'worker_id' => $dispatch->worker_id,
|
|
||||||
'status' => $dispatch->status,
|
|
||||||
'status_text' => $statusList[$dispatch->status],
|
|
||||||
'remark' => $remark,
|
|
||||||
'admin_user' => $dispatch->admin_user??'sys',
|
|
||||||
];
|
|
||||||
dd($data);
|
|
||||||
|
|
||||||
|
|
||||||
dd($res);
|
dd($res);
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
49
application/admin/controller/AmapTrait.php
Normal file
49
application/admin/controller/AmapTrait.php
Normal file
|
|
@ -0,0 +1,49 @@
|
||||||
|
<?php
|
||||||
|
namespace app\admin\controller;;
|
||||||
|
|
||||||
|
use fast\Http;
|
||||||
|
use think\Env;
|
||||||
|
|
||||||
|
trait AmapTrait
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* 高德API Key,使用时请赋值或者在类中覆盖此属性
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
protected $amapKey = null;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 调用高德逆地理编码 获取地址信息
|
||||||
|
*
|
||||||
|
* @param string $location 经纬度,格式 "经度,纬度"
|
||||||
|
* @param bool $returnAll 是否返回全部结果,默认false只返回地址字符串
|
||||||
|
* @return array|string|false 返回数组全部数据,或字符串详细地址,失败返回false
|
||||||
|
*/
|
||||||
|
public function getAddressByKeyword(string $keyword)
|
||||||
|
{
|
||||||
|
$this->amapKey = Env::get('amap_key');
|
||||||
|
$url = 'https://restapi.amap.com/v5/place/text';
|
||||||
|
$params = [
|
||||||
|
'key' => $this->amapKey,
|
||||||
|
'keywords' => $keyword,
|
||||||
|
'page_size' => 1,
|
||||||
|
];
|
||||||
|
|
||||||
|
try {
|
||||||
|
$response = Http::get($url, $params);
|
||||||
|
$data = json_decode($response, true);
|
||||||
|
// dd($data);
|
||||||
|
if (isset($data['status']) && $data['status'] == '1') {
|
||||||
|
return $data['pois']['0'] ?? false;
|
||||||
|
}
|
||||||
|
} catch (\Exception $e) {
|
||||||
|
throw $e;
|
||||||
|
// 这里可以做日志记录
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 还可以封装更多高德API调用方法
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
|
@ -34,7 +34,7 @@ class AutoDispatchLogic
|
||||||
'order_id' => $order->id,
|
'order_id' => $order->id,
|
||||||
'type' => 2,
|
'type' => 2,
|
||||||
'worker_id' => $worker_id,
|
'worker_id' => $worker_id,
|
||||||
'plan_time' => $order->plan_time,
|
'plan_time' => $order->plan_time ?? null,
|
||||||
'is_receipt' => $order->receive_type == 1,
|
'is_receipt' => $order->receive_type == 1,
|
||||||
];
|
];
|
||||||
|
|
||||||
|
|
|
||||||
91
application/admin/controller/CustomerInfoExtractor.php
Normal file
91
application/admin/controller/CustomerInfoExtractor.php
Normal file
|
|
@ -0,0 +1,91 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
|
||||||
|
namespace app\admin\controller;
|
||||||
|
|
||||||
|
trait CustomerInfoExtractor
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* 提取完整客户信息
|
||||||
|
*/
|
||||||
|
public function extractCustomerInfo(string $chatText, array $serviceTypes): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'nickname' => $this->extractNickname($chatText),
|
||||||
|
'city' => $this->extractCity($chatText),
|
||||||
|
'district' => $this->extractDistrict($chatText),
|
||||||
|
'address' => $this->extractAddress($chatText),
|
||||||
|
'phone' => $this->extractPhone($chatText),
|
||||||
|
'remark' => $this->extractRemark($chatText),
|
||||||
|
'services' => $this->extractServices($chatText, $serviceTypes),
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function extractNickname(string $text): ?string
|
||||||
|
{
|
||||||
|
if (preg_match('/^(.*?)\s*-->/u', $text, $match)) {
|
||||||
|
return trim($match[1]);
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function extractCity(string $text): ?string
|
||||||
|
{
|
||||||
|
if (preg_match('/(北京|上海|广州|深圳|武汉|成都|重庆|杭州|南京|天津|西安|苏州|郑州|长沙|青岛|合肥|福州|厦门|南昌|昆明|大连|宁波|无锡|哈尔滨|长春|石家庄|南宁|贵阳|兰州|呼和浩特|乌鲁木齐)/u', $text, $match)) {
|
||||||
|
return $match[1];
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function extractDistrict(string $text): ?string
|
||||||
|
{
|
||||||
|
if (preg_match('/([\p{Han}]{1,10}区)/u', $text, $match)) {
|
||||||
|
return $match[1];
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function extractAddress(string $text): ?string
|
||||||
|
{
|
||||||
|
if (preg_match('/(湖北省|四川省|北京市|上海市|重庆市|[\p{Han}]+省)?[\p{Han}]+市\s*[\p{Han}]+区.*?(\d+栋.*?室)/u', $text, $match)) {
|
||||||
|
return $match[0];
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function extractPhone(string $text): ?string
|
||||||
|
{
|
||||||
|
if (preg_match('/1[3-9]\d{9}/', $text, $match)) {
|
||||||
|
return $match[0];
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function extractRemark(string $text): ?string
|
||||||
|
{
|
||||||
|
if (preg_match_all('/https?:\/\/[^\s]+/i', $text, $matches)) {
|
||||||
|
return implode(', ', $matches[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 其他软件/售后/推广语也可加关键词检测
|
||||||
|
if (str_contains($text, '软件下载') || str_contains($text, '自动发货')) {
|
||||||
|
return '可能包含软件下载或推广信息';
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function extractServices(string $text, array $serviceTypes): array
|
||||||
|
{
|
||||||
|
$cleaned = array_filter(array_map('trim', $serviceTypes));
|
||||||
|
usort($cleaned, fn($a, $b) => mb_strlen($b, 'UTF-8') - mb_strlen($a, 'UTF-8'));
|
||||||
|
|
||||||
|
$matched = [];
|
||||||
|
foreach ($cleaned as $service) {
|
||||||
|
if (mb_stripos($text, $service) !== false) {
|
||||||
|
$matched[] = $service;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $matched;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -5,6 +5,7 @@ namespace app\admin\controller;
|
||||||
use app\admin\addresmart\Address;
|
use app\admin\addresmart\Address;
|
||||||
use app\admin\controller\orders\DispatchLogic;
|
use app\admin\controller\orders\DispatchLogic;
|
||||||
use app\admin\model\Admin;
|
use app\admin\model\Admin;
|
||||||
|
use app\admin\model\Item;
|
||||||
use app\admin\model\Message;
|
use app\admin\model\Message;
|
||||||
use app\admin\model\order\Invoice;
|
use app\admin\model\order\Invoice;
|
||||||
use app\admin\model\OrderDispatch;
|
use app\admin\model\OrderDispatch;
|
||||||
|
|
@ -30,6 +31,7 @@ use function Symfony\Component\Clock\now;
|
||||||
*/
|
*/
|
||||||
class Order extends Backend
|
class Order extends Backend
|
||||||
{
|
{
|
||||||
|
use CustomerInfoExtractor;
|
||||||
/**
|
/**
|
||||||
* Order模型对象
|
* Order模型对象
|
||||||
* @var \app\admin\model\Order
|
* @var \app\admin\model\Order
|
||||||
|
|
@ -39,6 +41,8 @@ class Order extends Backend
|
||||||
protected $items = null;
|
protected $items = null;
|
||||||
protected $itemsformattedTree = null;
|
protected $itemsformattedTree = null;
|
||||||
|
|
||||||
|
protected $noNeedRight = ['smart'];
|
||||||
|
|
||||||
public function _initialize()
|
public function _initialize()
|
||||||
{
|
{
|
||||||
parent::_initialize();
|
parent::_initialize();
|
||||||
|
|
@ -142,6 +146,8 @@ class Order extends Backend
|
||||||
'receive_type',
|
'receive_type',
|
||||||
'plan_time',
|
'plan_time',
|
||||||
'coupon_id',
|
'coupon_id',
|
||||||
|
'total',
|
||||||
|
'online_amount',
|
||||||
'aftersale_id'
|
'aftersale_id'
|
||||||
])
|
])
|
||||||
->where($where);
|
->where($where);
|
||||||
|
|
@ -204,11 +210,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'] = '';
|
||||||
|
}
|
||||||
|
|
||||||
$params = array_filter($params, function ($val) {
|
$params = array_filter($params, function ($val) {
|
||||||
return $val != '';
|
return $val != '';
|
||||||
});
|
});
|
||||||
|
|
@ -244,12 +260,12 @@ class Order extends Backend
|
||||||
$params['admin_id'] = $this->auth->id;
|
$params['admin_id'] = $this->auth->id;
|
||||||
}
|
}
|
||||||
$params['status'] = 10;
|
$params['status'] = 10;
|
||||||
|
$params['total'] = $params['online_amount'] ?? 0;
|
||||||
$params['order_no'] = $this->generateOrderNumber();
|
$params['order_no'] = $this->generateOrderNumber();
|
||||||
$params['create_time'] = date('Y-m-d H:i:s');
|
$params['create_time'] = date('Y-m-d H:i:s');
|
||||||
$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);
|
||||||
}
|
}
|
||||||
|
|
@ -261,7 +277,7 @@ class Order extends Backend
|
||||||
if ($result === false) {
|
if ($result === false) {
|
||||||
$this->error(__('No rows were inserted'));
|
$this->error(__('No rows were inserted'));
|
||||||
}
|
}
|
||||||
$this->success();
|
$this->success(data:$this->model);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function edit($ids = null)
|
public function edit($ids = null)
|
||||||
|
|
@ -288,6 +304,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');
|
||||||
|
|
@ -295,7 +325,6 @@ class Order extends Backend
|
||||||
$params['source_shop'] = $sources[$params['source']] ?? null;
|
$params['source_shop'] = $sources[$params['source']] ?? null;
|
||||||
|
|
||||||
$sources = $this->sources;
|
$sources = $this->sources;
|
||||||
$items = $this->items;
|
|
||||||
|
|
||||||
$sources = array_column($sources, 'title', 'id');
|
$sources = array_column($sources, 'title', 'id');
|
||||||
|
|
||||||
|
|
@ -316,7 +345,7 @@ class Order extends Backend
|
||||||
}
|
}
|
||||||
$area = new \app\admin\model\Area();
|
$area = new \app\admin\model\Area();
|
||||||
$area_name = $area->getNameByCode($order->area_id);
|
$area_name = $area->getNameByCode($order->area_id);
|
||||||
$order->area_name = str_replace(',', '/', $area_name);
|
$order->area_name = str_replace(',', '/', $area_name ?? '');
|
||||||
// dd($area_name);
|
// dd($area_name);
|
||||||
// 将订单数据传递到视图
|
// 将订单数据传递到视图
|
||||||
$this->assign('row', $order);
|
$this->assign('row', $order);
|
||||||
|
|
@ -350,23 +379,48 @@ class Order extends Backend
|
||||||
return $this->fetch();
|
return $this->fetch();
|
||||||
}
|
}
|
||||||
|
|
||||||
function generateOrderNumber($prefix = 'ORD')
|
function generateOrderNumber($prefix = '')
|
||||||
{
|
{
|
||||||
// 获取当前时间戳(精确到毫秒)
|
// 获取当前时间戳(精确到毫秒)
|
||||||
$timestamp = microtime(true);
|
$timestamp = microtime(true);
|
||||||
$date = date('YmdHis', (int)$timestamp); // 格式:YYYYMMDDHHMMSS
|
$date = date('YmdHis', (int)$timestamp); // 格式:YYYYMMDDHHMMSS
|
||||||
$randomNum = strtoupper(substr(md5($timestamp), 0, 4)); // 从时间戳生成一个随机字符串,取前四个字符
|
// $randomNum = strtoupper(substr(md5($timestamp), 0, 4)); // 从时间戳生成一个随机字符串,取前四个字符
|
||||||
|
$code = str_pad(mt_rand(0, 999999), 6, '0', STR_PAD_LEFT);
|
||||||
// 组合生成的订单编号
|
// 组合生成的订单编号
|
||||||
$orderNumber = $prefix . $date . $randomNum;
|
$orderNumber = $prefix . $date . $code;
|
||||||
|
|
||||||
return $orderNumber;
|
return $orderNumber;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
use AmapTrait;
|
||||||
public function smart()
|
public function smart()
|
||||||
{
|
{
|
||||||
$this->success(data: Address::smart(request()->get('str')));
|
// $titles = Item::where('status',1)->column('title');
|
||||||
|
// $res = $this->extractCustomerInfo(request()->post('str'),$titles);
|
||||||
|
// dd($res);
|
||||||
|
$data = Address::smart(request()->post('str'));
|
||||||
|
|
||||||
|
if ($data['item']['id'] ?? 0){
|
||||||
|
$data['item']['item'] = $this->findElementByValue($this->itemsformattedTree, $data['item']['id'] ?? null);
|
||||||
|
}
|
||||||
|
preg_match('/\b(1[3-9]\d{9})\b/',$data['mobile'],$match);
|
||||||
|
$data['mobile'] = $match[0] ?? $data['mobile'];
|
||||||
|
|
||||||
|
if ($data['addr'] && $data['addr']!=''){
|
||||||
|
$address = $this->getAddressByKeyword($data['addr']);
|
||||||
|
if ($address){
|
||||||
|
$data['area_id'] = $address['adcode'];
|
||||||
|
$location = explode(',',$address['location']);
|
||||||
|
$data['lng'] = $location[0];
|
||||||
|
$data['lat'] = $location[1];
|
||||||
|
}else{
|
||||||
|
$data['addr'] ='';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// dd($data);
|
||||||
|
|
||||||
|
|
||||||
|
$this->success(data: $data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -10,18 +10,68 @@ class Order extends Validate
|
||||||
* 验证规则
|
* 验证规则
|
||||||
*/
|
*/
|
||||||
protected $rule = [
|
protected $rule = [
|
||||||
|
'source' => 'require',
|
||||||
|
'item_id' => 'require',
|
||||||
|
'customer' => 'require|max:32',
|
||||||
|
'tel' => 'require|number|max:32|regex:/^1[3-9]\d{9}$/',
|
||||||
|
'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' => '请输入客户电话',
|
||||||
|
'tel.regex' => '电话号码格式不正确',
|
||||||
|
'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',
|
||||||
|
],
|
||||||
];
|
];
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,48 +1,66 @@
|
||||||
|
<div class="full-height flex-c body-hidden">
|
||||||
<div class="full-height">
|
|
||||||
<div class="overlay"></div> <!-- 遮罩层 -->
|
|
||||||
<div class="content">
|
|
||||||
<!-- 表单区域(占2/3) -->
|
|
||||||
<div class="form-area">
|
|
||||||
<div>
|
|
||||||
<div class="card-body">
|
|
||||||
<form id="add-form" class="row" role="form" data-toggle="validator" method="POST" action="">
|
<form id="add-form" class="row" role="form" data-toggle="validator" method="POST" action="">
|
||||||
<div class="col-lg-4 col-xs-12 col-md-6">
|
<div class="ctr flex-sb">
|
||||||
<div class="form-group">
|
<div class="left">
|
||||||
<label class="control-label col-xs-12 col-lg-4">{:__('Customer')}:</label>
|
<input type="hidden" name="row[dispatch_type]" value="2">
|
||||||
<div class="col-xs-12 col-sm-8">
|
<div class="line flex-sb">
|
||||||
<input id="c-customer" data-rule="required" class="form-control" name="row[customer]" type="text">
|
<div class="item flex-sb">
|
||||||
|
<div class="title flex-c"><span class="required">*</span>订单渠道:</div>
|
||||||
|
<div class="value">
|
||||||
|
<select id="c-source" data-live-search="true" title="请选择订单渠道" 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>
|
</div>
|
||||||
<div class="form-group">
|
<div class="item flex-sb">
|
||||||
<label class="control-label col-xs-12 col-lg-4">{:__('Tel')}:</label>
|
<div class="title flex-c"><span class="required">*</span>服务项目:</div>
|
||||||
<div class="col-xs-12 col-sm-8">
|
<div class="value flex-c">
|
||||||
<input id="c-tel" data-rule="required" class="form-control" name="row[tel]" type="number">
|
<input type="text" placeholder="请选择服务项目" id="item_id" autocomplete="off" 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>
|
||||||
|
</div>
|
||||||
|
<div class="line flex-sb">
|
||||||
<div class="form-group">
|
<div class="item flex-sb">
|
||||||
<label class="control-label col-xs-12 col-lg-4">{:__('Area_id')}:</label>
|
<div class="title flex-c"><span class="required">*</span>客户昵称:</div>
|
||||||
<div class='col-xs-12 col-sm-8'>
|
<div class="value flex-c">
|
||||||
<input id="c-city" data-rule="required" class="form-control" data-toggle="city-picker" type="text" value="" />
|
<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" style="display: none">
|
||||||
|
<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="" />
|
<input id="area_id" style="display: none" class="form-control" name="row[area_id]" hidden type="text" value="" />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group">
|
<div class="line multi-line flex-sb bt-40">
|
||||||
<label class="control-label col-xs-12 col-lg-4">{:__('Address')}:</label>
|
<div class="select-address">
|
||||||
<div class="col-xs-12 col-sm-8">
|
<div class="title flex-c"><span class="required">*</span>详细地址:</div>
|
||||||
<div class="myform-group">
|
<div class="select-ctr flex-c">
|
||||||
<input id="c-address" data-rule="required"
|
<div class="btn btn-sm btn-primary flex-c" id="area_map"
|
||||||
class="form-control"
|
|
||||||
readonly
|
|
||||||
name="row[address]"
|
|
||||||
type="text">
|
|
||||||
<div class="btn btn-primary" id="area_map"
|
|
||||||
data-input-id="c-address"
|
data-input-id="c-address"
|
||||||
data-lng-id="lng"
|
data-lng-id="lng"
|
||||||
data-lat-id="lat">地图查找</div>
|
data-lat-id="lat">地图查找</div>
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class='address line' style="position: relative">
|
||||||
|
<input id="c-address"
|
||||||
|
class="form-control"
|
||||||
|
placeholder="请通过地图查找选择"
|
||||||
|
autocomplete="off"
|
||||||
|
name="row[address]"
|
||||||
|
type="text" />
|
||||||
|
<ul id="suggestionList"></ul>
|
||||||
<input type="text" style="display: none"
|
<input type="text" style="display: none"
|
||||||
name="row[lng]" id="lng" >
|
name="row[lng]" id="lng" >
|
||||||
<input type="text" style="display: none"
|
<input type="text" style="display: none"
|
||||||
|
|
@ -50,103 +68,28 @@
|
||||||
<input type="text" style="display: none" id="area_name">
|
<input type="text" style="display: none" id="area_name">
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="line flex-sb">
|
||||||
<div class="form-group">
|
<div class="item flex-sb">
|
||||||
<label class="control-label col-xs-12 col-lg-4">{:__('Item_title')}:</label>
|
<div class="title flex-c">收款方式:</div>
|
||||||
<div class="col-xs-12 col-sm-8">
|
<div class="value flex-c">
|
||||||
<input type="text" data-rule="required" id="item_id" class="zd-input__inner">
|
<select name="row[receive_type]" id="receive_type" class="form-control selectpicker">
|
||||||
<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 selected value="1">已收定金</option>
|
||||||
<option value="2">已收全款</option>
|
<option value="2">已收全款</option>
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="item flex-sb">
|
||||||
<div class="form-group">
|
<div class="title flex-c"><span class="required">*</span>收款金额:</div>
|
||||||
<label class="control-label col-xs-12 col-lg-4">收款金额:</label>
|
<div class="value flex-c">
|
||||||
<div class="col-xs-12 col-sm-8">
|
<input name="row[online_amount]" class="form-control form-input" type="number" placeholder="请输入收款金额">
|
||||||
<input data-rule="required" name="row[online_amount]" class="form-control" type="number">
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="line flex-sb bt-40" id="coupon">
|
||||||
|
<div class="item flex-sb">
|
||||||
<div class="form-group">
|
<div class="title flex-c">优惠:</div>
|
||||||
<label class="control-label col-xs-12 col-lg-4">{:__('Coupons')}:</label>
|
<div class="value flex-c">
|
||||||
<div class="col-xs-12 col-sm-8">
|
<select id="c-coupon" data-live-search="true" title="请选择优惠信息" name="row[coupon_id]" class="form-control selectpicker show-tick">
|
||||||
<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>
|
<option selected value="0">不使用优惠</option>
|
||||||
{foreach $coupons as $item}
|
{foreach $coupons as $item}
|
||||||
<option data-subtext="{$item['description']}" value="{$item['id']}">{$item['code']}</option>
|
<option data-subtext="{$item['description']}" value="{$item['id']}">{$item['code']}</option>
|
||||||
|
|
@ -154,130 +97,174 @@
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group">
|
</div>
|
||||||
<label class="control-label col-xs-12 col-lg-4">录单员:</label>
|
|
||||||
<div class="col-xs-12 col-sm-8">
|
<div class="line flex-sb">
|
||||||
<select id="c-users" data-live-search="true" title="不选择默认当前登陆账号" name="row[admin_id]" class="form-control selectpicker show-tick">
|
<div class="item flex-sb">
|
||||||
<option value="-1">不选择默认当前登陆账号</option>
|
<div class="title flex-c">上门时间:</div>
|
||||||
|
<div class="value flex-l">
|
||||||
|
{:build_radios('row[set_time]', ['1'=>'有', '0'=>'无'])}
|
||||||
|
</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="请选择上门时间"
|
||||||
|
id="time"
|
||||||
|
data-date-format="YYYY-MM-DD HH:mm"
|
||||||
|
autocomplete="off"
|
||||||
|
data-date-stepping="30"
|
||||||
|
data-date-side-by-side="true"
|
||||||
|
data-date-autoclose="true"
|
||||||
|
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}
|
{foreach $users as $item}
|
||||||
<option value="{$item['id']}">{$item['nickname']}</option>
|
<option value="{$item['id']}">{$item['nickname']}</option>
|
||||||
{/foreach}
|
{/foreach}
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
</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="line flex-sb">
|
||||||
|
<div class="title flex-c">图片上传:</div>
|
||||||
|
<div class="value">
|
||||||
|
<div class="input-group flex-l">
|
||||||
|
<input id="c-images" placeholder="请上传或直接粘贴图片" class="form-input mr-2 images-input" name="row[images]" type="text">
|
||||||
|
<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>
|
</div>
|
||||||
|
<span class="msg-box n-right" for="c-images"></span>
|
||||||
<div class="form-group col-xs-12 layer-footer text-right">
|
</div>
|
||||||
<div class="col-xs-12 col-sm-12">
|
<ul class="row list-inline faupload-preview" id="p-images"></ul>
|
||||||
<button id="mysubmit" class="btn btn-primary btn-embossed">录入并清空</button>
|
|
||||||
<button id="mybuttom" class="btn btn-primary btn-embossed">录入并保留信息</button>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="right">
|
||||||
<div class="col-lg-4 col-xs-12 col-md-6">
|
<div class="line flex-sb">
|
||||||
<h5 class=" col-md-12 text-left">快速输入:</h5>
|
<div class="item flex-sb">
|
||||||
<div class="col-md-12">
|
<div class="title flex-l">快速录入:</div>
|
||||||
<div class="form-floating">
|
|
||||||
<textarea rows="8" style="width: 100%;resize: vertical" class="form-control" placeholder="复制内容,快速输入" id="smart_text"></textarea>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-md-12 mt-2">
|
<div class="line flex-sb smart-text-line">
|
||||||
<button id="smart" class="btn btn-primary btn-embossed">智能识别</button>
|
<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">
|
||||||
|
<button id="mysubmit" class="btn btn-default submit">录入并清空</button>
|
||||||
|
<button id="mybuttom" class="btn btn-success submit-continue">录入并保留信息</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<link rel="stylesheet" href="/assets/css/select.css">
|
<link rel="stylesheet" href="/assets/css/select.css">
|
||||||
|
<link rel="stylesheet" href="/assets/css/create-order.css">
|
||||||
<style>
|
<style>
|
||||||
.full-height {
|
.ctr {
|
||||||
/*height: 100vh;*/
|
width: 1000px;
|
||||||
width: 100vw;
|
height: 768px;
|
||||||
background: #fff;
|
overflow: auto;
|
||||||
}
|
background: #FFFFFF;
|
||||||
.myform-group{
|
border-radius: 8px;
|
||||||
display: flex;
|
|
||||||
}
|
|
||||||
.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;
|
|
||||||
height: calc(100vh - 70px);
|
|
||||||
overflow-y: auto;
|
|
||||||
}
|
|
||||||
.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;
|
|
||||||
}
|
|
||||||
.control-label{
|
|
||||||
text-align: left;
|
|
||||||
}
|
|
||||||
.col-xs-12{
|
|
||||||
margin: 5px 0;
|
|
||||||
position: relative;
|
position: relative;
|
||||||
|
margin-left: -230px;
|
||||||
}
|
}
|
||||||
.msg-box{
|
.ctr .left {
|
||||||
|
width: 614px;
|
||||||
|
height: 768px;
|
||||||
|
padding: 20px 10px;
|
||||||
|
}
|
||||||
|
.ctr .right {
|
||||||
|
width: 386px;
|
||||||
|
height: 768px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#suggestionList {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
|
top: 100%;
|
||||||
left: 0;
|
left: 0;
|
||||||
top: 30px;
|
width: 100%;
|
||||||
|
max-height: 240px;
|
||||||
|
overflow-y: auto;
|
||||||
|
margin-top: 4px;
|
||||||
|
padding: 0;
|
||||||
|
list-style: none;
|
||||||
|
background-color: #fff;
|
||||||
|
border-radius: 8px;
|
||||||
|
box-shadow: 0 4px 12px rgba(0,0,0,0.1);
|
||||||
|
z-index: 9999;
|
||||||
|
font-size: 14px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#suggestionList li {
|
||||||
|
padding: 10px 14px;
|
||||||
|
cursor: pointer;
|
||||||
|
transition: background-color 0.2s;
|
||||||
|
border-bottom: 1px solid #f1f1f1;
|
||||||
|
}
|
||||||
|
|
||||||
|
#suggestionList li:last-child {
|
||||||
|
border-bottom: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
#suggestionList li:hover {
|
||||||
|
background-color: #f5f8fa;
|
||||||
|
color: #007aff;
|
||||||
|
}
|
||||||
|
#suggestionList li.active {
|
||||||
|
background-color: #82b0e1;
|
||||||
|
color: white;
|
||||||
|
}
|
||||||
|
|
||||||
</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>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,83 +1,151 @@
|
||||||
|
<div class="full-height flex-c body-hidden">
|
||||||
<div class="full-height">
|
|
||||||
<div class="overlay"></div> <!-- 遮罩层 -->
|
|
||||||
<div class="content">
|
|
||||||
<!-- 表单区域(占2/3) -->
|
|
||||||
<div class="form-area">
|
|
||||||
<div>
|
|
||||||
<div class="card-body">
|
|
||||||
<form id="add-form" class="row" role="form" data-toggle="validator" method="POST" action="{:url('order/add')}">
|
<form id="add-form" class="row" role="form" data-toggle="validator" method="POST" action="{:url('order/add')}">
|
||||||
<div class="col-md-6">
|
<div class="ctr flex-sb">
|
||||||
<div class="form-group col-xs-12">
|
<div class="left">
|
||||||
<label class="control-label col-xs-12 col-sm-3">{:__('Customer')}:</label>
|
<input type="hidden" name="row[dispatch_type]" value="2">
|
||||||
<div class="col-xs-12 col-sm-8">
|
<div class="line flex-sb">
|
||||||
<input id="c-customer" value="{$row['customer']}" data-rule="required" class="form-control" name="row[customer]" type="text">
|
<div class="item flex-sb">
|
||||||
|
<div class="title flex-c"><span class="required">*</span>订单渠道:</div>
|
||||||
|
<div class="value">
|
||||||
|
<select id="c-source" data-live-search="true" title="请选择订单渠道" 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>
|
</div>
|
||||||
<div class="form-group col-xs-12">
|
<div class="item flex-sb">
|
||||||
<label class="control-label col-xs-12 col-sm-3">{:__('Tel')}:</label>
|
<div class="title flex-c"><span class="required">*</span>服务项目:</div>
|
||||||
<div class="col-xs-12 col-sm-8">
|
<div class="value flex-c">
|
||||||
<input id="c-tel" data-rule="required" value="{$row['tel']}" class="form-control" name="row[tel]" type="number">
|
<input type="text" placeholder="请选择服务项目" id="item_id" autocomplete="off" 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>
|
||||||
<div class="form-group col-xs-12">
|
<div class="line flex-sb">
|
||||||
<label class="control-label col-xs-12 col-sm-3">{:__('Area_id')}:</label>
|
<div class="item flex-sb">
|
||||||
<div class='col-xs-12 col-sm-8'>
|
<div class="title flex-c"><span class="required">*</span>客户昵称:</div>
|
||||||
<input id="c-city" data-rule="required" value="{$row.area_name}" class="form-control" data-toggle="city-picker" type="text" value="{$row.address}" />
|
<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" style="display: none">
|
||||||
|
<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="" />
|
<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>
|
</div>
|
||||||
<div class="form-group col-xs-12">
|
<div class="line multi-line flex-sb bt-40">
|
||||||
<label class="control-label col-xs-12 col-sm-3">{:__('Address')}:</label>
|
<div class="select-address">
|
||||||
<div class="col-xs-12 col-sm-8">
|
<div class="title flex-c"><span class="required">*</span>详细地址:</div>
|
||||||
<div class="myform-group">
|
<div class="select-ctr flex-c">
|
||||||
<input id="c-address" data-rule="required"
|
<div class="btn btn-sm btn-primary flex-c" id="area_map"
|
||||||
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-input-id="c-address"
|
||||||
data-lng-id="lng"
|
data-lng-id="lng"
|
||||||
data-lat-id="lat">地图查找</div>
|
data-lat-id="lat">地图查找</div>
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class='address line' style="position: relative">
|
||||||
|
<input id="c-address"
|
||||||
|
class="form-control"
|
||||||
|
placeholder="请通过地图查找选择"
|
||||||
|
autocomplete="off"
|
||||||
|
value="{$row.address}"
|
||||||
|
name="row[address]"
|
||||||
|
type="text" />
|
||||||
|
<ul id="suggestionList"></ul>
|
||||||
<input type="text" style="display: none"
|
<input type="text" style="display: none"
|
||||||
name="row[lng]" value="{$row.lng}" id="lng" >
|
name="row[lng]" id="lng" value="{$row.lng}">
|
||||||
<input type="text" style="display: none"
|
<input type="text" style="display: none"
|
||||||
name="row[lat]" value="{$row.lat}" id="lat">
|
name="row[lat]" id="lat" value="{$row.lat}">
|
||||||
<input type="text" style="display: none" id="area_name">
|
<input type="text" style="display: none" id="area_name">
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="line flex-sb">
|
||||||
<div class="form-group col-xs-12">
|
<div class="item flex-sb">
|
||||||
<label class="control-label col-xs-12 col-sm-3">{:__('Item_title')}:</label>
|
<div class="title flex-c">收款方式:</div>
|
||||||
<div class="col-xs-12 col-sm-8">
|
<div class="value flex-c">
|
||||||
<input type="text" id="item_id" value="{$row.item_title}" data-value="{$row.item_title}" class="zd-input__inner">
|
<select name="row[receive_type]" class="form-control selectpicker" id="receive_type">
|
||||||
<input type="text" id="item_id_value" value="{$row.item_id}" style="display: none" name="row[item_id]" class="zd-input__inner">
|
<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" id="coupon">
|
||||||
|
<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>
|
</div>
|
||||||
|
|
||||||
<div class="form-group col-xs-12">
|
<div class="line flex-sb">
|
||||||
<label class="control-label col-xs-12 col-sm-3">{:__('Detail')}:</label>
|
<div class="item flex-sb">
|
||||||
<div class="col-xs-12 col-sm-8">
|
<div class="title flex-c">上门时间:</div>
|
||||||
<textarea id="c-detail" rows="8" style="width: 100%;resize: vertical" class="form-control" name="row[detail]">{$row.detail}</textarea>
|
<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']}"
|
||||||
|
autocomplete="off"
|
||||||
|
data-date-stepping="30"
|
||||||
|
data-date-side-by-side="true"
|
||||||
|
data-date-autoclose="true"
|
||||||
|
data-date-format="YYYY-MM-DD HH:mm" 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>
|
</div>
|
||||||
|
|
||||||
<div class="form-group col-xs-12">
|
<div class="line flex-sb">
|
||||||
<label class="control-label col-xs-12 col-sm-3">上门时间:</label>
|
<div class="title flex-c">图片上传:</div>
|
||||||
<div class="col-xs-12 col-sm-8">
|
<div class="value">
|
||||||
<input data-rule="required" value="{$row['plan_time']}" name="row[plan_time]" class="form-control datetimepicker">
|
<div class="input-group flex-l">
|
||||||
</div>
|
<input id="c-images" placeholder="请上传或直接粘贴图片" class="form-input mr-2 images-input" name="row[images]" type="text" value="{$row['images']}">
|
||||||
</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">
|
<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="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>
|
<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>
|
||||||
|
|
@ -87,180 +155,93 @@
|
||||||
<ul class="row list-inline faupload-preview" id="p-images"></ul>
|
<ul class="row list-inline faupload-preview" id="p-images"></ul>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form-group hidden layer-footer">
|
||||||
<div class="col-md-6">
|
<label class="control-label col-xs-12 col-sm-2 col-xs-2"></label>
|
||||||
<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">
|
<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">
|
<button type="submit" class="btn btn-primary btn-embossed disabled">复制</button>
|
||||||
{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>
|
</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>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
<link rel="stylesheet" href="/assets/css/select.css">
|
||||||
</div>
|
<link rel="stylesheet" href="/assets/css/create-order.css">
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<script>
|
|
||||||
|
|
||||||
</script>
|
|
||||||
<style>
|
<style>
|
||||||
.myform-group{
|
.ctr {
|
||||||
display: flex;
|
width: 630px;
|
||||||
|
height: 768px;
|
||||||
|
overflow: auto;
|
||||||
|
background: #FFFFFF;
|
||||||
|
border-radius: 8px;
|
||||||
|
position: relative;
|
||||||
}
|
}
|
||||||
.full-height {
|
.ctr .left {
|
||||||
height: 100vh;
|
width: 614px;
|
||||||
width: 100vw;
|
height: 768px;
|
||||||
background: #fff;
|
padding: 20px 10px;
|
||||||
}
|
}
|
||||||
.overlay {
|
#suggestionList {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
top: 0;
|
top: 100%;
|
||||||
left: 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%;
|
width: 100%;
|
||||||
max-height: 300px;
|
max-height: 240px;
|
||||||
overflow-y: auto;
|
overflow-y: auto;
|
||||||
|
margin-top: 4px;
|
||||||
|
padding: 0;
|
||||||
|
list-style: none;
|
||||||
background-color: #fff;
|
background-color: #fff;
|
||||||
border: 1px solid #ccc;
|
border-radius: 8px;
|
||||||
border-radius: 4px;
|
box-shadow: 0 4px 12px rgba(0,0,0,0.1);
|
||||||
box-shadow: 0px 8px 16px rgba(0, 0, 0, 0.2);
|
z-index: 9999;
|
||||||
margin: 6px 12px;
|
font-size: 14px;
|
||||||
}
|
}
|
||||||
.dropdown-item {
|
|
||||||
padding: 8px;
|
#suggestionList li {
|
||||||
|
padding: 10px 14px;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
|
transition: background-color 0.2s;
|
||||||
|
border-bottom: 1px solid #f1f1f1;
|
||||||
}
|
}
|
||||||
.suggestion-item:hover {
|
|
||||||
background-color: #f0f0f0;
|
#suggestionList li:last-child {
|
||||||
|
border-bottom: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
#suggestionList li:hover {
|
||||||
|
background-color: #f5f8fa;
|
||||||
|
color: #007aff;
|
||||||
|
}
|
||||||
|
#suggestionList li.active {
|
||||||
|
background-color: #82b0e1;
|
||||||
|
color: white;
|
||||||
}
|
}
|
||||||
</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>
|
||||||
<link rel="stylesheet" href="/assets/css/select.css">
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,83 +1,150 @@
|
||||||
|
<div class="full-height flex-c body-hidden">
|
||||||
<div class="full-height">
|
|
||||||
<div class="overlay"></div> <!-- 遮罩层 -->
|
|
||||||
<div class="content">
|
|
||||||
<!-- 表单区域(占2/3) -->
|
|
||||||
<div class="form-area">
|
|
||||||
<div>
|
|
||||||
<div class="card-body">
|
|
||||||
<form id="add-form" class="row" role="form" data-toggle="validator" method="POST" action="">
|
<form id="add-form" class="row" role="form" data-toggle="validator" method="POST" action="">
|
||||||
<div class="col-md-6">
|
<div class="ctr flex-sb">
|
||||||
<div class="form-group col-xs-12">
|
<div class="left">
|
||||||
<label class="control-label col-xs-12 col-sm-3">{:__('Customer')}:</label>
|
<div class="line flex-sb">
|
||||||
<div class="col-xs-12 col-sm-8">
|
<div class="item flex-sb">
|
||||||
<input id="c-customer" value="{$row['customer']}" data-rule="required" class="form-control" name="row[customer]" type="text">
|
<div class="title flex-c"><span class="required">*</span>订单渠道:</div>
|
||||||
|
<div class="value">
|
||||||
|
<select id="c-source" data-live-search="true" title="请选择订单渠道" 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>
|
</div>
|
||||||
<div class="form-group col-xs-12">
|
<div class="item flex-sb">
|
||||||
<label class="control-label col-xs-12 col-sm-3">{:__('Tel')}:</label>
|
<div class="title flex-c"><span class="required">*</span>服务项目:</div>
|
||||||
<div class="col-xs-12 col-sm-8">
|
<div class="value flex-c">
|
||||||
<input id="c-tel" data-rule="required" value="{$row['tel']}" class="form-control" name="row[tel]" type="number">
|
<input type="text" placeholder="请选择服务项目" autocomplete="off" 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>
|
||||||
<div class="form-group col-xs-12">
|
<div class="line flex-sb">
|
||||||
<label class="control-label col-xs-12 col-sm-3">{:__('Area_id')}:</label>
|
<div class="item flex-sb">
|
||||||
<div class='col-xs-12 col-sm-8'>
|
<div class="title flex-c"><span class="required">*</span>客户昵称:</div>
|
||||||
<input id="c-city" data-rule="required" value="{$row.area_name}" class="form-control" data-toggle="city-picker" type="text" value="{$row.address}" />
|
<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" style="display: none">
|
||||||
|
<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="" />
|
<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>
|
</div>
|
||||||
<div class="form-group col-xs-12">
|
<div class="line multi-line flex-sb bt-40">
|
||||||
<label class="control-label col-xs-12 col-sm-3">{:__('Address')}:</label>
|
<div class="select-address">
|
||||||
<div class="col-xs-12 col-sm-8">
|
<div class="title flex-c"><span class="required">*</span>详细地址:</div>
|
||||||
<div class="myform-group">
|
<div class="select-ctr flex-c">
|
||||||
<input id="c-address" data-rule="required"
|
<div class="btn btn-sm btn-primary flex-c" id="area_map"
|
||||||
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-input-id="c-address"
|
||||||
data-lng-id="lng"
|
data-lng-id="lng"
|
||||||
data-lat-id="lat">地图查找</div>
|
data-lat-id="lat">地图查找</div>
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class='address line' style="position: relative">
|
||||||
|
<input id="c-address"
|
||||||
|
class="form-control"
|
||||||
|
placeholder="请通过地图查找选择"
|
||||||
|
autocomplete="off"
|
||||||
|
value="{$row.address}"
|
||||||
|
name="row[address]"
|
||||||
|
type="text" />
|
||||||
|
<ul id="suggestionList"></ul>
|
||||||
<input type="text" style="display: none"
|
<input type="text" style="display: none"
|
||||||
name="row[lng]" id="lng" >
|
name="row[lng]" id="lng" value="{$row.lng}">
|
||||||
<input type="text" style="display: none"
|
<input type="text" style="display: none"
|
||||||
name="row[lat]" id="lat">
|
name="row[lat]" id="lat" value="{$row.lat}">
|
||||||
<input type="text" style="display: none" id="area_name">
|
<input type="text" style="display: none" id="area_name">
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="line flex-sb">
|
||||||
<div class="form-group col-xs-12">
|
<div class="item flex-sb">
|
||||||
<label class="control-label col-xs-12 col-sm-3">{:__('Item_title')}:</label>
|
<div class="title flex-c">收款方式:</div>
|
||||||
<div class="col-xs-12 col-sm-8">
|
<div class="value flex-c">
|
||||||
<input type="text" data-rule="required" id="item_id" value="{$row.item_title}" data-value="{$row.item_title}" class="zd-input__inner">
|
<select name="row[receive_type]" id="receive_type" class="form-control selectpicker">
|
||||||
<input type="text" id="item_id_value" value="{$row.item_id}" style="display: none" name="row[item_id]" class="zd-input__inner">
|
<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" id="coupon">
|
||||||
|
<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>
|
</div>
|
||||||
|
|
||||||
<div class="form-group col-xs-12">
|
<div class="line flex-sb">
|
||||||
<label class="control-label col-xs-12 col-sm-3">{:__('Detail')}:</label>
|
<div class="item flex-sb">
|
||||||
<div class="col-xs-12 col-sm-8">
|
<div class="title flex-c">上门时间:</div>
|
||||||
<textarea id="c-detail" rows="8" style="width: 100%;resize: vertical" class="form-control" name="row[detail]">{$row.detail}</textarea>
|
<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']}"
|
||||||
|
autocomplete="off"
|
||||||
|
data-date-stepping="30"
|
||||||
|
data-date-side-by-side="true"
|
||||||
|
data-date-autoclose="true"
|
||||||
|
data-date-format="YYYY-MM-DD HH:mm" 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>
|
</div>
|
||||||
|
|
||||||
<div class="form-group col-xs-12">
|
<div class="line flex-sb">
|
||||||
<label class="control-label col-xs-12 col-sm-3">上门时间:</label>
|
<div class="title flex-c">图片上传:</div>
|
||||||
<div class="col-xs-12 col-sm-8">
|
<div class="value">
|
||||||
<input data-rule="required" value="{$row['plan_time']}" name="row[plan_time]" class="form-control datetimepicker">
|
<div class="input-group flex-l">
|
||||||
</div>
|
<input id="c-images" placeholder="请上传或直接粘贴图片" class="form-input mr-2 images-input" name="row[images]" type="text" value="{$row['images']}">
|
||||||
</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">
|
<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="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>
|
<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>
|
||||||
|
|
@ -87,176 +154,93 @@
|
||||||
<ul class="row list-inline faupload-preview" id="p-images"></ul>
|
<ul class="row list-inline faupload-preview" id="p-images"></ul>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form-group hidden layer-footer">
|
||||||
<div class="col-md-6">
|
<label class="control-label col-xs-12 col-sm-2 col-xs-2"></label>
|
||||||
<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">
|
<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">
|
<button type="submit" class="btn btn-primary btn-embossed disabled">修改</button>
|
||||||
{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>
|
</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>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
<link rel="stylesheet" href="/assets/css/select.css">
|
||||||
</div>
|
<link rel="stylesheet" href="/assets/css/create-order.css">
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<script>
|
|
||||||
|
|
||||||
</script>
|
|
||||||
<style>
|
<style>
|
||||||
.myform-group{
|
.ctr {
|
||||||
display: flex;
|
width: 630px;
|
||||||
|
height: 768px;
|
||||||
|
overflow: auto;
|
||||||
|
background: #FFFFFF;
|
||||||
|
border-radius: 8px;
|
||||||
|
position: relative;
|
||||||
}
|
}
|
||||||
.full-height {
|
.ctr .left {
|
||||||
height: 100vh;
|
width: 614px;
|
||||||
width: 100vw;
|
height: 768px;
|
||||||
background: #fff;
|
padding: 20px 10px;
|
||||||
}
|
}
|
||||||
.overlay {
|
#suggestionList {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
top: 0;
|
top: 100%;
|
||||||
left: 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%;
|
width: 100%;
|
||||||
max-height: 300px;
|
max-height: 240px;
|
||||||
overflow-y: auto;
|
overflow-y: auto;
|
||||||
|
margin-top: 4px;
|
||||||
|
padding: 0;
|
||||||
|
list-style: none;
|
||||||
background-color: #fff;
|
background-color: #fff;
|
||||||
border: 1px solid #ccc;
|
border-radius: 8px;
|
||||||
border-radius: 4px;
|
box-shadow: 0 4px 12px rgba(0,0,0,0.1);
|
||||||
box-shadow: 0px 8px 16px rgba(0, 0, 0, 0.2);
|
z-index: 9999;
|
||||||
margin: 6px 12px;
|
font-size: 14px;
|
||||||
}
|
}
|
||||||
.dropdown-item {
|
|
||||||
padding: 8px;
|
#suggestionList li {
|
||||||
|
padding: 10px 14px;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
|
transition: background-color 0.2s;
|
||||||
|
border-bottom: 1px solid #f1f1f1;
|
||||||
}
|
}
|
||||||
.suggestion-item:hover {
|
|
||||||
background-color: #f0f0f0;
|
#suggestionList li:last-child {
|
||||||
|
border-bottom: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
#suggestionList li:hover {
|
||||||
|
background-color: #f5f8fa;
|
||||||
|
color: #007aff;
|
||||||
|
}
|
||||||
|
#suggestionList li.active {
|
||||||
|
background-color: #82b0e1;
|
||||||
|
color: white;
|
||||||
}
|
}
|
||||||
</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>
|
||||||
<link rel="stylesheet" href="/assets/css/select.css">
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,46 +0,0 @@
|
||||||
<?php
|
|
||||||
|
|
||||||
return array (
|
|
||||||
'name' => '神帝',
|
|
||||||
'beian' => '2',
|
|
||||||
'cdnurl' => '',
|
|
||||||
'version' => '1.0.2',
|
|
||||||
'timezone' => 'Asia/Shanghai',
|
|
||||||
'forbiddenip' => '',
|
|
||||||
'languages' =>
|
|
||||||
array (
|
|
||||||
'backend' => 'zh-cn',
|
|
||||||
'frontend' => 'zh-cn',
|
|
||||||
),
|
|
||||||
'fixedpage' => 'dashboard',
|
|
||||||
'categorytype' =>
|
|
||||||
array (
|
|
||||||
'default' => 'Default',
|
|
||||||
'page' => 'Page',
|
|
||||||
'article' => 'Article',
|
|
||||||
'test' => 'Test',
|
|
||||||
),
|
|
||||||
'configgroup' =>
|
|
||||||
array (
|
|
||||||
'basic' => 'Basic',
|
|
||||||
'email' => 'Email',
|
|
||||||
'dictionary' => 'Dictionary',
|
|
||||||
'user' => 'User',
|
|
||||||
'example' => 'Example',
|
|
||||||
),
|
|
||||||
'mail_type' => '1',
|
|
||||||
'mail_smtp_host' => 'smtp.qq.com',
|
|
||||||
'mail_smtp_port' => '465',
|
|
||||||
'mail_smtp_user' => '',
|
|
||||||
'mail_smtp_pass' => '',
|
|
||||||
'mail_verify_type' => '2',
|
|
||||||
'mail_from' => '',
|
|
||||||
'attachmentcategory' =>
|
|
||||||
array (
|
|
||||||
'category1' => 'Category1',
|
|
||||||
'category2' => 'Category2',
|
|
||||||
'custom' => 'Custom',
|
|
||||||
),
|
|
||||||
'ip_check' => '0',
|
|
||||||
'allowip' => '',
|
|
||||||
);
|
|
||||||
|
|
@ -402,6 +402,7 @@ class OrderDispatchService extends BaseService
|
||||||
$order->is_material_used = $params['is_material_used'];
|
$order->is_material_used = $params['is_material_used'];
|
||||||
if ($order->is_material_used == 1) {
|
if ($order->is_material_used == 1) {
|
||||||
// 材料成本
|
// 材料成本
|
||||||
|
$orderDispatch->material_cost = $params['material_cost'];
|
||||||
$order->material_cost = $params['material_cost'];
|
$order->material_cost = $params['material_cost'];
|
||||||
// 材料凭证图片组
|
// 材料凭证图片组
|
||||||
$order->material_images = $this->removeStrCdnUrl($params['material_images']);
|
$order->material_images = $this->removeStrCdnUrl($params['material_images']);
|
||||||
|
|
|
||||||
226
public/assets/css/create-order.css
Normal file
226
public/assets/css/create-order.css
Normal file
|
|
@ -0,0 +1,226 @@
|
||||||
|
.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: 768px;
|
||||||
|
background: #f1f4f6;
|
||||||
|
}
|
||||||
|
|
||||||
|
.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;
|
||||||
|
}
|
||||||
|
|
||||||
|
.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;
|
||||||
|
}
|
||||||
|
|
||||||
|
.images-input {
|
||||||
|
width: 180px;
|
||||||
|
padding: 0 12px;
|
||||||
|
}
|
||||||
BIN
public/assets/img/automation.png
Normal file
BIN
public/assets/img/automation.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 1.7 KiB |
|
|
@ -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');
|
||||||
|
|
|
||||||
|
|
@ -4,6 +4,8 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form', 'cascader'], function
|
||||||
$('[name^="row["]').val('');
|
$('[name^="row["]').val('');
|
||||||
$("#c-city").citypicker('reset');
|
$("#c-city").citypicker('reset');
|
||||||
$("#item_id").val('');
|
$("#item_id").val('');
|
||||||
|
$('.zd-cascader-menu').find('li.in-active-path').removeClass('in-active-path');
|
||||||
|
$('.zd-cascader-panel').find('.is-selected-icon').remove();
|
||||||
$("#item_id_value").val('');
|
$("#item_id_value").val('');
|
||||||
$(".selectpicker").val('').selectpicker('refresh');
|
$(".selectpicker").val('').selectpicker('refresh');
|
||||||
}
|
}
|
||||||
|
|
@ -26,23 +28,17 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form', 'cascader'], function
|
||||||
|
|
||||||
// 拼装文本
|
// 拼装文本
|
||||||
function assembleOrderMessage(data) {
|
function assembleOrderMessage(data) {
|
||||||
const message = `
|
const message = `订单编号: ${data.order_no}
|
||||||
【订单详情】
|
|
||||||
录单员: ${data.user.nickname}
|
|
||||||
订单编号: ${data.order_no}
|
|
||||||
服务名称: ${data.item_title}
|
服务名称: ${data.item_title}
|
||||||
客户姓名: ${data.customer}
|
客户昵称: ${data.customer}
|
||||||
客户电话: ${data.tel}
|
客户电话: ${data.tel}
|
||||||
上门时间: ${data.plan_time}
|
客户地址: ${data.address}
|
||||||
优惠码: ${data.coupon?.description||'无'}
|
收款金额: ${data.receive_type === 1 ? '已收定金 ' + data.online_amount : '已收全款 ' + data.online_amount}
|
||||||
订单状态: ${data.status_text}
|
优惠活动: ${data.coupon?.description || '无'}
|
||||||
详细地址: ${data.address}
|
订单详情: ${data.detail || '无'}
|
||||||
订单详情: ${data.detail}
|
|
||||||
订单备注: ${data.remark}
|
订单备注: ${data.remark}
|
||||||
派单方式: ${data.dispatch_type === 1 ? '手动派单' : '自动派单'}
|
预约时间: ${data.plan_time || '无'}
|
||||||
收款方式: ${data.receive_type === 1 ? '已收定金' : '已收全款'}
|
`;
|
||||||
|
|
||||||
请查收以上订单信息。`;
|
|
||||||
|
|
||||||
return message;
|
return message;
|
||||||
}
|
}
|
||||||
|
|
@ -418,33 +414,47 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form', 'cascader'], function
|
||||||
add: function () {
|
add: function () {
|
||||||
$("#mybuttom").on("click", function () {
|
$("#mybuttom").on("click", function () {
|
||||||
const res = $("form[role=form]").isValid();
|
const res = $("form[role=form]").isValid();
|
||||||
|
if ($('#lng').val() && $('#lng').val() !== ''){
|
||||||
if (res) {
|
if (res) {
|
||||||
Form.api.submit($("form[role=form]"));
|
Form.api.submit($("form[role=form]"),function (data){
|
||||||
// Toastr.success('录入成功');
|
copyToClipboard(assembleOrderMessage(data));
|
||||||
|
});
|
||||||
|
|
||||||
}
|
}
|
||||||
|
}else{
|
||||||
|
Toastr.success('请选择有效地址');
|
||||||
|
}
|
||||||
|
|
||||||
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 ($('#lng').val() && $('#lng').val() !== ''){
|
||||||
if (res) {
|
if (res) {
|
||||||
Form.api.submit($("form[role=form]"));
|
Form.api.submit($("form[role=form]"), function (data, ret) {
|
||||||
clearInfo();
|
clearInfo();
|
||||||
// Toastr.success('录入成功');
|
copyToClipboard(assembleOrderMessage(data));
|
||||||
|
return false;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
Toastr.success('请选择有效地址');
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
});
|
});
|
||||||
Form.api.bindevent($("form[role=form]"));
|
|
||||||
$("#smart").on("click", function () {
|
$("#smart").on("click", function () {
|
||||||
$.ajax({
|
Fast.api.ajax({
|
||||||
url: "order/smart", // 你的 API 地址
|
url: "order/smart", // 你的 API 地址
|
||||||
type: "GET",
|
type: "post",
|
||||||
|
contentType: 'application/json',
|
||||||
dataType: "json",
|
dataType: "json",
|
||||||
data: {
|
data: JSON.stringify({
|
||||||
str: $('#smart_text').val()
|
str: $('#smart_text').val()
|
||||||
},
|
})
|
||||||
success: function (data) {
|
}, function (data) {
|
||||||
if (data.code === 1) {
|
|
||||||
data = data.data;
|
|
||||||
if (data.mobile !== '') {
|
if (data.mobile !== '') {
|
||||||
$('#c-tel').val(data.mobile);
|
$('#c-tel').val(data.mobile);
|
||||||
}
|
}
|
||||||
|
|
@ -458,26 +468,32 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form', 'cascader'], function
|
||||||
if (data.idn) {
|
if (data.idn) {
|
||||||
$('#c-source-id').val(data.idn);
|
$('#c-source-id').val(data.idn);
|
||||||
}
|
}
|
||||||
let citypicker = $('#c-city');
|
|
||||||
// $city.citypicker({
|
// $city.citypicker({
|
||||||
// province: data.province,
|
// province: data.province,
|
||||||
// city: data.city,
|
// city: data.city,
|
||||||
// district: data.region
|
// district: data.region
|
||||||
// });
|
// });
|
||||||
citypicker.val(data.province + '/' + data.city + '/' + data.region);
|
if (data.area_id) {
|
||||||
citypicker = citypicker.data("citypicker");
|
$("#area_id").val(data.area_id);
|
||||||
citypicker.refresh();
|
|
||||||
var code = citypicker.getCode("district") || citypicker.getCode("city") || citypicker.getCode("province");
|
|
||||||
$("#area_id").val(code);
|
|
||||||
$("#area_name").val(citypicker.getVal());
|
|
||||||
}
|
}
|
||||||
|
if (data.lat) {
|
||||||
},
|
$("#lat").val(data.lat);
|
||||||
error: function () {
|
|
||||||
console.error("请求失败");
|
|
||||||
}
|
}
|
||||||
|
if (data.lng) {
|
||||||
|
$("#lng").val(data.lng);
|
||||||
|
}
|
||||||
|
if (data.area_id) {
|
||||||
|
$("#area_id").val(data.area_id);
|
||||||
|
}
|
||||||
|
if (data.addr && data.addr !== '') {
|
||||||
|
$("#c-address").val(data.addr);
|
||||||
|
$("#area_name").val(data.addr);
|
||||||
|
}
|
||||||
|
Toastr.info('识别成功');
|
||||||
|
return false;
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
Controller.api.bindevent();
|
||||||
Controller.api.map();
|
Controller.api.map();
|
||||||
},
|
},
|
||||||
edit: function () {
|
edit: function () {
|
||||||
|
|
@ -519,6 +535,7 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form', 'cascader'], function
|
||||||
$('#c-bank_account').closest('.form-group').hide();
|
$('#c-bank_account').closest('.form-group').hide();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 初始化时执行一次
|
// 初始化时执行一次
|
||||||
toggleInvoiceFields();
|
toggleInvoiceFields();
|
||||||
|
|
||||||
|
|
@ -540,16 +557,7 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form', 'cascader'], function
|
||||||
$("#area_id").val(code);
|
$("#area_id").val(code);
|
||||||
$("#area_name").val(citypicker.getVal());
|
$("#area_name").val(citypicker.getVal());
|
||||||
});
|
});
|
||||||
// $("#area_map").data("callback", function (res) {
|
|
||||||
// Form.api.target($('#c-address'));
|
|
||||||
// });
|
|
||||||
$(document).on('click', "#area_map", function (e) {
|
$(document).on('click', "#area_map", function (e) {
|
||||||
const data = $("#c-city").val();
|
|
||||||
if (!data){
|
|
||||||
Toastr.error('请先选择区域');
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
var that = this;
|
var that = this;
|
||||||
var callback = $(that).data('callback');
|
var callback = $(that).data('callback');
|
||||||
var input_id = $(that).data("input-id") ? $(that).data("input-id") : "";
|
var input_id = $(that).data("input-id") ? $(that).data("input-id") : "";
|
||||||
|
|
@ -558,9 +566,9 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form', 'cascader'], function
|
||||||
var zoom_id = $(that).data("zoom-id") ? $(that).data("zoom-id") : "";
|
var zoom_id = $(that).data("zoom-id") ? $(that).data("zoom-id") : "";
|
||||||
var lat = lat_id ? $("#" + lat_id).val() : '';
|
var lat = lat_id ? $("#" + lat_id).val() : '';
|
||||||
var lng = lng_id ? $("#" + lng_id).val() : '';
|
var lng = lng_id ? $("#" + lng_id).val() : '';
|
||||||
var city_code = $("#c-city").val();
|
var city_code = $("#area_id").val();
|
||||||
var zoom = zoom_id ? $("#" + zoom_id).val() : '';
|
var zoom = zoom_id ? $("#" + zoom_id).val() : '';
|
||||||
var url = "/addons/address/index/select?a=1";
|
var url = "/addons/address/index/select?";
|
||||||
url += (lat && lng) ? 'lat=' + lat + '&lng=' + lng +
|
url += (lat && lng) ? 'lat=' + lat + '&lng=' + lng +
|
||||||
(input_id ? "&address=" + $("#" + input_id).val() : "")
|
(input_id ? "&address=" + $("#" + input_id).val() : "")
|
||||||
+ (zoom ? "&zoom=" + zoom : "") : ''
|
+ (zoom ? "&zoom=" + zoom : "") : ''
|
||||||
|
|
@ -570,12 +578,12 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form', 'cascader'], function
|
||||||
}
|
}
|
||||||
// console.log(url);
|
// console.log(url);
|
||||||
Fast.api.open(url, '位置选择', {
|
Fast.api.open(url, '位置选择', {
|
||||||
callback: function (res) {
|
callback: function (res, data) {
|
||||||
input_id && $("#" + input_id).val(res.address).trigger("change");
|
input_id && $("#" + input_id).val(res.address).trigger("change");
|
||||||
lat_id && $("#" + lat_id).val(res.lat).trigger("change");
|
lat_id && $("#" + lat_id).val(res.lat).trigger("change");
|
||||||
lng_id && $("#" + lng_id).val(res.lng).trigger("change");
|
lng_id && $("#" + lng_id).val(res.lng).trigger("change");
|
||||||
zoom_id && $("#" + zoom_id).val(res.zoom).trigger("change");
|
zoom_id && $("#" + zoom_id).val(res.zoom).trigger("change");
|
||||||
|
$('#area_id').val(res.city_code);
|
||||||
try {
|
try {
|
||||||
//执行回调函数
|
//执行回调函数
|
||||||
if (typeof callback === 'function') {
|
if (typeof callback === 'function') {
|
||||||
|
|
@ -588,9 +596,7 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form', 'cascader'], function
|
||||||
});
|
});
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
var _data = items;
|
var _data = items;
|
||||||
|
|
||||||
$('#item_id').zdCascader({
|
$('#item_id').zdCascader({
|
||||||
data: _data,
|
data: _data,
|
||||||
onChange: function ($this, data, allPathData) {
|
onChange: function ($this, data, allPathData) {
|
||||||
|
|
@ -599,6 +605,162 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form', 'cascader'], function
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
$('#item_id').val($('#item_id').data('value')).focus();
|
$('#item_id').val($('#item_id').data('value')).focus();
|
||||||
|
|
||||||
|
const mainSelect = document.getElementById('receive_type');
|
||||||
|
const otherSelect = document.getElementById('coupon');
|
||||||
|
|
||||||
|
function toggleOtherSelect() {
|
||||||
|
if (mainSelect.value === '2') {
|
||||||
|
otherSelect.style.display = 'none';
|
||||||
|
} else {
|
||||||
|
otherSelect.style.display = '';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
mainSelect.addEventListener('change', toggleOtherSelect);
|
||||||
|
toggleOtherSelect();
|
||||||
|
|
||||||
|
$('input[name="row[set_time]"]').on('change', toggleTime);
|
||||||
|
|
||||||
|
function toggleTime() {
|
||||||
|
var val = $('input[name="row[set_time]"]:checked').val();
|
||||||
|
if (val == 1) {
|
||||||
|
$('#set-time').show();
|
||||||
|
} else {
|
||||||
|
$('#set-time').hide();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
toggleTime();
|
||||||
|
|
||||||
|
const amapKey = 'c299da50c080dfccf9b1d00560ff9639';
|
||||||
|
|
||||||
|
let isComposing = false;
|
||||||
|
let addressSelected = false;
|
||||||
|
let selectedIndex = -1;
|
||||||
|
$('#c-address')
|
||||||
|
.on('compositionstart', () => {
|
||||||
|
isComposing = true;
|
||||||
|
})
|
||||||
|
.on('compositionend', () => {
|
||||||
|
isComposing = false;
|
||||||
|
// 不执行 handleInput,由 input 触发
|
||||||
|
})
|
||||||
|
.on('input', debounce(function (e) {
|
||||||
|
if (!isComposing) handleInput(e);
|
||||||
|
}, 300))
|
||||||
|
.on('blur', function () {
|
||||||
|
// 如果还没有选择地址,且列表中有内容,则默认选择第一个
|
||||||
|
|
||||||
|
// 如果还没有选择地址,且列表中有内容,则默认选择第一个
|
||||||
|
if (!addressSelected && $('#suggestionList li').length > 0) {
|
||||||
|
$('#suggestionList li').first().trigger('mousedown');
|
||||||
|
}
|
||||||
|
|
||||||
|
$('#suggestionList').hide();
|
||||||
|
})
|
||||||
|
.on('focus', function () {
|
||||||
|
// 如果还没有选择地址,且列表中有内容,则默认选择第一个
|
||||||
|
$('#suggestionList').show();
|
||||||
|
})
|
||||||
|
.on('keydown', function (e) {
|
||||||
|
const $items = $('#suggestionList li');
|
||||||
|
const len = $items.length;
|
||||||
|
|
||||||
|
if (!len) return;
|
||||||
|
|
||||||
|
if (e.key === 'ArrowDown') {
|
||||||
|
e.preventDefault();
|
||||||
|
selectedIndex = (selectedIndex + 1) % len;
|
||||||
|
updateActiveItem($items);
|
||||||
|
} else if (e.key === 'ArrowUp') {
|
||||||
|
e.preventDefault();
|
||||||
|
selectedIndex = (selectedIndex - 1 + len) % len;
|
||||||
|
updateActiveItem($items);
|
||||||
|
} else if (e.key === 'Enter') {
|
||||||
|
if (selectedIndex >= 0 && selectedIndex < len) {
|
||||||
|
e.preventDefault();
|
||||||
|
$items.eq(selectedIndex).trigger('mousedown');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
function updateActiveItem($items) {
|
||||||
|
$items.removeClass('active');
|
||||||
|
if (selectedIndex >= 0) {
|
||||||
|
const $active = $items.eq(selectedIndex);
|
||||||
|
$active.addClass('active');
|
||||||
|
|
||||||
|
// 自动滚动使其可见
|
||||||
|
const container = $('#suggestionList')[0];
|
||||||
|
const item = $active[0];
|
||||||
|
|
||||||
|
if (item && container) {
|
||||||
|
const itemTop = item.offsetTop;
|
||||||
|
const itemBottom = itemTop + item.offsetHeight;
|
||||||
|
const containerTop = container.scrollTop;
|
||||||
|
const containerBottom = containerTop + container.clientHeight;
|
||||||
|
|
||||||
|
if (itemTop < containerTop) {
|
||||||
|
container.scrollTop = itemTop;
|
||||||
|
} else if (itemBottom > containerBottom) {
|
||||||
|
container.scrollTop = itemBottom - container.clientHeight;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function handleInput(e) {
|
||||||
|
selectedIndex = -1;
|
||||||
|
addressSelected = false;
|
||||||
|
const keyword = $(e.target).val();
|
||||||
|
if (!keyword.trim() || /^[\s\p{P}]+$/u.test(keyword)) return;
|
||||||
|
if (!keyword) return $('#c-address').empty();
|
||||||
|
|
||||||
|
$.getJSON('https://restapi.amap.com/v3/assistant/inputtips', {
|
||||||
|
key: amapKey,
|
||||||
|
keywords: keyword,
|
||||||
|
datatype: 'all',
|
||||||
|
city: '全国',
|
||||||
|
}, function (res) {
|
||||||
|
if (res.tips) {
|
||||||
|
let html = '';
|
||||||
|
res.tips.forEach(tip => {
|
||||||
|
if (tip.location) {
|
||||||
|
html += `<li data-name="${tip.district} ${tip.name}" data-location="${tip.location}">
|
||||||
|
${tip.district} ${tip.name}
|
||||||
|
</li>`;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
$('#suggestionList').html(html).show();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function debounce(fn, delay = 300) {
|
||||||
|
let timer = null;
|
||||||
|
return function (...args) {
|
||||||
|
clearTimeout(timer);
|
||||||
|
timer = setTimeout(() => {
|
||||||
|
fn.apply(this, args);
|
||||||
|
}, delay);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
$('#suggestionList').on('mousedown', 'li', function (e) {
|
||||||
|
const name = $(this).data('name');
|
||||||
|
const location = $(this).data('location'); // "经度,纬度"
|
||||||
|
const [lng, lat] = location.split(',');
|
||||||
|
console.log('click');
|
||||||
|
// $('#c-address').val(name);
|
||||||
|
$('#lng').val(lng);
|
||||||
|
$('#lat').val(lat);
|
||||||
|
// 隐藏提示列表
|
||||||
|
$('#suggestionList').hide();
|
||||||
|
selectedIndex = -1;
|
||||||
|
addressSelected = true;
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -132,6 +132,10 @@
|
||||||
this.search(this.$el.val());
|
this.search(this.$el.val());
|
||||||
}, this));
|
}, this));
|
||||||
}
|
}
|
||||||
|
ZdCascader.prototype.clear_path_class = function () {
|
||||||
|
this.$dropdownWrap.find('li.' + this.CLASS.checkClass.nodeAnchor).removeClass(this.CLASS
|
||||||
|
.checkClass.nodeAnchor);
|
||||||
|
}
|
||||||
ZdCascader.prototype._wrapClick = function () {
|
ZdCascader.prototype._wrapClick = function () {
|
||||||
event.stopPropagation();
|
event.stopPropagation();
|
||||||
this.$el.focus();
|
this.$el.focus();
|
||||||
|
|
@ -307,7 +311,8 @@
|
||||||
this.reload(null, true)
|
this.reload(null, true)
|
||||||
return
|
return
|
||||||
};
|
};
|
||||||
var keywords = keyword.replace(' ','').replace('/','').split('')
|
var keywords = [keyword];
|
||||||
|
// console.log(keywords);
|
||||||
var data = this.labelList.filter(function(item) {
|
var data = this.labelList.filter(function(item) {
|
||||||
item.num = 0
|
item.num = 0
|
||||||
keywords.forEach(function(key) {
|
keywords.forEach(function(key) {
|
||||||
|
|
@ -317,8 +322,7 @@
|
||||||
return item.num>(keywords.length==1?0:1)
|
return item.num>(keywords.length==1?0:1)
|
||||||
}).sort(function(a, b) {
|
}).sort(function(a, b) {
|
||||||
return b.num - a.num
|
return b.num - a.num
|
||||||
}).slice(0, 10)
|
}).slice(0, 15)
|
||||||
console.log(data);
|
|
||||||
this.reload(data, true)
|
this.reload(data, true)
|
||||||
}
|
}
|
||||||
//关键词筛选数据(暂不用)
|
//关键词筛选数据(暂不用)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user