订单录入
This commit is contained in:
parent
5e17d3025b
commit
43691f78ef
30
application/admin/controller/Area.php
Normal file
30
application/admin/controller/Area.php
Normal file
|
|
@ -0,0 +1,30 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace app\admin\controller;
|
||||||
|
|
||||||
|
use app\common\controller\Backend;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 订单列管理
|
||||||
|
*
|
||||||
|
* @icon fa fa-circle-o
|
||||||
|
*/
|
||||||
|
class Area extends Backend
|
||||||
|
{
|
||||||
|
protected $noNeedLogin = ['search'];
|
||||||
|
|
||||||
|
public function search(){
|
||||||
|
$keyword = request()->get('keyword');
|
||||||
|
if (!$keyword){
|
||||||
|
$this->success(data:[]);
|
||||||
|
}else{
|
||||||
|
$data = model('area')
|
||||||
|
->where('merge_name','like','%'.$keyword.'%')
|
||||||
|
->where('level','=',3)
|
||||||
|
->field('area_code, merge_name')
|
||||||
|
->limit(0,10)
|
||||||
|
->select();
|
||||||
|
$this->success(data:$data);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -73,7 +73,6 @@ class Order extends Backend
|
||||||
if ($this->dataLimit && $this->dataLimitFieldAutoFill) {
|
if ($this->dataLimit && $this->dataLimitFieldAutoFill) {
|
||||||
$params[$this->dataLimitField] = $this->auth->id;
|
$params[$this->dataLimitField] = $this->auth->id;
|
||||||
}
|
}
|
||||||
dd($params);
|
|
||||||
$result = false;
|
$result = false;
|
||||||
Db::startTrans();
|
Db::startTrans();
|
||||||
try {
|
try {
|
||||||
|
|
@ -83,6 +82,12 @@ class Order extends Backend
|
||||||
$validate = is_bool($this->modelValidate) ? ($this->modelSceneValidate ? $name . '.add' : $name) : $this->modelValidate;
|
$validate = is_bool($this->modelValidate) ? ($this->modelSceneValidate ? $name . '.add' : $name) : $this->modelValidate;
|
||||||
$this->model->validateFailException()->validate($validate);
|
$this->model->validateFailException()->validate($validate);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$params['enter_admin_id'] = $this->auth->id;
|
||||||
|
$params['status'] = 10;
|
||||||
|
$params['order_no'] = $this->generateOrderNumber();
|
||||||
|
|
||||||
|
|
||||||
$result = $this->model->allowField(true)->save($params);
|
$result = $this->model->allowField(true)->save($params);
|
||||||
Db::commit();
|
Db::commit();
|
||||||
} catch (ValidateException|PDOException|Exception $e) {
|
} catch (ValidateException|PDOException|Exception $e) {
|
||||||
|
|
@ -94,4 +99,16 @@ class Order extends Backend
|
||||||
}
|
}
|
||||||
$this->success();
|
$this->success();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function generateOrderNumber($prefix = 'ORD') {
|
||||||
|
// 获取当前时间戳(精确到毫秒)
|
||||||
|
$timestamp = microtime(true);
|
||||||
|
$date = date('YmdHis', (int)$timestamp); // 格式:YYYYMMDDHHMMSS
|
||||||
|
$randomNum = strtoupper(substr(md5($timestamp), 0, 4)); // 从时间戳生成一个随机字符串,取前四个字符
|
||||||
|
|
||||||
|
// 组合生成的订单编号
|
||||||
|
$orderNumber = $prefix . $date . $randomNum;
|
||||||
|
|
||||||
|
return $orderNumber;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
15
application/admin/model/Area.php
Normal file
15
application/admin/model/Area.php
Normal file
|
|
@ -0,0 +1,15 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace app\admin\model;
|
||||||
|
|
||||||
|
use think\Model;
|
||||||
|
|
||||||
|
|
||||||
|
class Area extends Model
|
||||||
|
{
|
||||||
|
|
||||||
|
// 表名
|
||||||
|
protected $name = 'areas';
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -1,83 +1,170 @@
|
||||||
<form id="add-form" class="form-horizontal" role="form" data-toggle="validator" method="POST" action="">
|
|
||||||
|
|
||||||
<div class="form-group">
|
<div class="full-height">
|
||||||
<label class="control-label col-xs-12 col-sm-2">{:__('Customer')}:</label>
|
<div class="overlay"></div> <!-- 遮罩层 -->
|
||||||
<div class="col-xs-12 col-sm-8">
|
<div class="content">
|
||||||
<input id="c-customer" class="form-control" name="row[customer]" type="text">
|
<!-- 表单区域(占2/3) -->
|
||||||
</div>
|
<div class="form-area">
|
||||||
</div>
|
<div class="w-75">
|
||||||
<div class="form-group">
|
<div class="card-body">
|
||||||
<label class="control-label col-xs-12 col-sm-2">{:__('Tel')}:</label>
|
<h5 class="card-title">录入订单</h5>
|
||||||
<div class="col-xs-12 col-sm-8">
|
<form id="add-form" class="form-horizontal" role="form" data-toggle="validator" method="POST" action="">
|
||||||
<input id="c-tel" data-rule="required" class="form-control" name="row[tel]" type="text">
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="form-group">
|
|
||||||
<label class="control-label col-xs-12 col-sm-2">{:__('Status')}:</label>
|
|
||||||
<div class="col-xs-12 col-sm-8">
|
|
||||||
|
|
||||||
<div class="radio">
|
<div class="form-group">
|
||||||
{foreach name="statusList" item="vo"}
|
<label class="control-label col-xs-12 col-sm-2">{:__('Customer')}:</label>
|
||||||
<label for="row[status]-{$key}"><input id="row[status]-{$key}" name="row[status]" type="radio" value="{$key}" {in name="key" value="10"}checked{/in} /> {$vo}</label>
|
<div class="col-xs-12 col-sm-8">
|
||||||
{/foreach}
|
<input id="c-customer" class="form-control" name="row[customer]" type="text">
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label class="control-label col-xs-12 col-sm-2">{:__('Tel')}:</label>
|
||||||
|
<div class="col-xs-12 col-sm-8">
|
||||||
|
<input id="c-tel" data-rule="required" class="form-control" name="row[tel]" type="number">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label class="control-label col-xs-12 col-sm-2">{:__('Area_id')}:</label>
|
||||||
|
<div class='col-xs-12 col-sm-8'>
|
||||||
|
<input id="c-area_id" class="form-control" type="text" value="" />
|
||||||
|
<!-- 选项下拉框 -->
|
||||||
|
<ul id="address-list" class="dropdown-menu" style="display: none;"></ul>
|
||||||
|
|
||||||
|
<!-- 存储选择的 area_code -->
|
||||||
|
<input type="hidden" id="selected-area-code" name="row[area_id]">
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label class="control-label col-xs-12 col-sm-2">{:__('Address')}:</label>
|
||||||
|
<div class="col-xs-12 col-sm-8">
|
||||||
|
<input id="c-address" data-rule="required" class="form-control" name="row[address]" type="text" value="">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label class="control-label col-xs-12 col-sm-2">{:__('Source')}:</label>
|
||||||
|
<div class="col-xs-12 col-sm-8">
|
||||||
|
<input id="c-source" data-rule="required" class="form-control" name="row[source]" type="number" value="0">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label class="control-label col-xs-12 col-sm-2">{:__('Service_title')}:</label>
|
||||||
|
<div class="col-xs-12 col-sm-8">
|
||||||
|
<input id="c-service_title" data-rule="required" class="form-control" name="row[service_title]" type="text" value="">
|
||||||
|
|
||||||
|
<!-- 选项下拉框 -->
|
||||||
|
<ul id="service-list" class="dropdown-menu" style="display: none;"></ul>
|
||||||
|
|
||||||
|
<!-- 存储选择的 area_code -->
|
||||||
|
<input type="hidden" id="selected-service_id" name="row[service_id]">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label class="control-label col-xs-12 col-sm-2">{:__('Detail')}:</label>
|
||||||
|
<div class="col-xs-12 col-sm-8">
|
||||||
|
<textarea id="c-detail" rows="4" 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-sm-2">{:__('Remark')}:</label>
|
||||||
|
<div class="col-xs-12 col-sm-8">
|
||||||
|
|
||||||
|
<textarea id="c-remark" rows="4" style="width: 100%;resize: vertical" class="form-control" name="row[remark]" ></textarea>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label class="control-label col-xs-12 col-sm-2">{:__('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 class="form-group layer-footer">
|
||||||
|
<label class="control-label col-xs-12 col-sm-2"></label>
|
||||||
|
<div class="col-xs-12 col-sm-8">
|
||||||
|
<button type="submit" class="btn btn-primary btn-embossed disabled">录入</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="form-group">
|
|
||||||
<label class="control-label col-xs-12 col-sm-2">{:__('Area_id')}:</label>
|
|
||||||
<div class='col-xs-12 col-sm-8'>
|
|
||||||
<input id="c-area_id" class="form-control" data-toggle="city-picker" name="row[area_id]" type="text" value="" />
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="form-group">
|
|
||||||
<label class="control-label col-xs-12 col-sm-2">{:__('Address')}:</label>
|
|
||||||
<div class="col-xs-12 col-sm-8">
|
|
||||||
<input id="c-address" data-rule="required" class="form-control" name="row[address]" type="text" value="">
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="form-group">
|
|
||||||
<label class="control-label col-xs-12 col-sm-2">{:__('Source')}:</label>
|
|
||||||
<div class="col-xs-12 col-sm-8">
|
|
||||||
<input id="c-source" data-rule="required" class="form-control" name="row[source]" type="number" value="0">
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="form-group">
|
|
||||||
<label class="control-label col-xs-12 col-sm-2">{:__('Service_title')}:</label>
|
|
||||||
<div class="col-xs-12 col-sm-8">
|
|
||||||
<input id="c-service_title" data-rule="required" class="form-control" name="row[service_title]" type="text" value="">
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="form-group">
|
|
||||||
<label class="control-label col-xs-12 col-sm-2">{:__('Detail')}:</label>
|
|
||||||
<div class="col-xs-12 col-sm-8">
|
|
||||||
<input id="c-detail" class="form-control" name="row[detail]" type="text">
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="form-group">
|
|
||||||
<label class="control-label col-xs-12 col-sm-2">{:__('Remark')}:</label>
|
|
||||||
<div class="col-xs-12 col-sm-8">
|
|
||||||
<input id="c-remark" class="form-control" name="row[remark]" type="text">
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="form-group">
|
|
||||||
<label class="control-label col-xs-12 col-sm-2">{:__('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>
|
</div>
|
||||||
<span class="msg-box n-right" for="c-images"></span>
|
|
||||||
</div>
|
</div>
|
||||||
<ul class="row list-inline faupload-preview" id="p-images"></ul>
|
</div>
|
||||||
|
|
||||||
|
<!-- 功能区(占1/3) -->
|
||||||
|
<div class="function-area ">
|
||||||
|
<h5 class="text-center">快速输入</h5>
|
||||||
|
<div class="form-floating">
|
||||||
|
<textarea rows="8" style="width: 100%;resize: vertical" class="form-control" placeholder="复制内容,快速输入" id="floatingTextarea"></textarea>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group layer-footer">
|
</div>
|
||||||
<label class="control-label col-xs-12 col-sm-2"></label>
|
<script>
|
||||||
<div class="col-xs-12 col-sm-8">
|
|
||||||
<button type="submit" class="btn btn-primary btn-embossed disabled">{:__('OK')}</button>
|
</script>
|
||||||
</div>
|
<style>
|
||||||
</div>
|
.full-height {
|
||||||
</form>
|
height: 100vh;
|
||||||
|
width: 100vw;
|
||||||
|
background: #fff;
|
||||||
|
}
|
||||||
|
.overlay {
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
right: 0;
|
||||||
|
bottom: 0;
|
||||||
|
background: rgba(0, 0, 0, 0.3); /* 背景黑色遮罩 */
|
||||||
|
z-index: -1;
|
||||||
|
}
|
||||||
|
.card {
|
||||||
|
border-radius: 10px;
|
||||||
|
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
|
||||||
|
}
|
||||||
|
.card-body {
|
||||||
|
padding: 2rem;
|
||||||
|
}
|
||||||
|
.content {
|
||||||
|
display: flex;
|
||||||
|
height: 100vh;
|
||||||
|
}
|
||||||
|
.form-area {
|
||||||
|
flex: 2;
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
align-items: flex-start;
|
||||||
|
}
|
||||||
|
.function-area {
|
||||||
|
flex: 1;
|
||||||
|
padding: 2rem;
|
||||||
|
background-color: #f8f9fa;
|
||||||
|
/*border-left: 1px solid #ddd;*/
|
||||||
|
}
|
||||||
|
.dropdown-menu {
|
||||||
|
position: absolute;
|
||||||
|
z-index: 1000;
|
||||||
|
width: 100%;
|
||||||
|
max-height: 300px;
|
||||||
|
overflow-y: auto;
|
||||||
|
background-color: #fff;
|
||||||
|
border: 1px solid #ccc;
|
||||||
|
border-radius: 4px;
|
||||||
|
box-shadow: 0px 8px 16px rgba(0, 0, 0, 0.2);
|
||||||
|
margin: 6px 12px;
|
||||||
|
}
|
||||||
|
.dropdown-item {
|
||||||
|
padding: 8px;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
.suggestion-item:hover {
|
||||||
|
background-color: #f0f0f0;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -83,5 +83,134 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefin
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
function parseAndFill() {
|
||||||
|
// 获取左侧输入框的内容
|
||||||
|
}
|
||||||
|
let $input = $("#c-area_id");
|
||||||
|
let $dropdown = $("#address-list");
|
||||||
|
let $hiddenField = $("#selected-area-code");
|
||||||
|
let timer = null; // 定义定时器
|
||||||
|
// 监听输入框
|
||||||
|
$input.on("input", function () {
|
||||||
|
clearTimeout(timer); // 清除上次的定时器
|
||||||
|
let keyword = $(this).val().trim();
|
||||||
|
|
||||||
|
if (keyword.length === 0) {
|
||||||
|
$dropdown.hide();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 延迟 500 毫秒后执行 AJAX 查询(防止过快触发)
|
||||||
|
timer = setTimeout(() => {
|
||||||
|
$.ajax({
|
||||||
|
url: "/admin/area/search", // 你的 API 地址
|
||||||
|
type: "GET",
|
||||||
|
data: { keyword: keyword },
|
||||||
|
dataType: "json",
|
||||||
|
success: function (data) {
|
||||||
|
renderDropdown(data.data);
|
||||||
|
},
|
||||||
|
error: function () {
|
||||||
|
console.error("请求失败");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}, 200); // 500 毫秒防抖
|
||||||
|
});
|
||||||
|
// 渲染城市下拉选项
|
||||||
|
function renderDropdown(data) {
|
||||||
|
$dropdown.empty(); // 清空列表
|
||||||
|
if (data.length === 0){
|
||||||
|
let $option = $("<li class='dropdown-item'></li>")
|
||||||
|
.text('未搜索到结果')
|
||||||
|
.attr("data-value", 0);
|
||||||
|
$dropdown.append($option);
|
||||||
|
}else{
|
||||||
|
data.forEach(item => {
|
||||||
|
let $option = $("<li class='dropdown-item'></li>")
|
||||||
|
.text(item.merge_name)
|
||||||
|
.attr("data-value", item.area_code) // 绑定 area_code
|
||||||
|
.on("click", function () {
|
||||||
|
$input.val(item.merge_name); // 选中后填充输入框
|
||||||
|
$hiddenField.val($(this).attr("data-value")); // 存储 area_code
|
||||||
|
$dropdown.hide();
|
||||||
|
});
|
||||||
|
|
||||||
|
$dropdown.append($option);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
$dropdown.show(); // 显示下拉框
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
let $inputService = $("#c-service_title");
|
||||||
|
let $dropdownService = $("#service-list");
|
||||||
|
let $hiddenFieldService = $("#c-service_id");
|
||||||
|
let timerService = null; // 定义定时器
|
||||||
|
|
||||||
|
$inputService.on("input", function () {
|
||||||
|
clearTimeout(timerService); // 清除上次的定时器
|
||||||
|
let keyword = $(this).val().trim();
|
||||||
|
|
||||||
|
if (keyword.length === 0) {
|
||||||
|
$dropdown.hide();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 延迟 500 毫秒后执行 AJAX 查询(防止过快触发)
|
||||||
|
timerService = setTimeout(() => {
|
||||||
|
$.ajax({
|
||||||
|
url: "/admin/area/search", // 你的 API 地址
|
||||||
|
type: "GET",
|
||||||
|
data: { keyword: keyword },
|
||||||
|
dataType: "json",
|
||||||
|
success: function (data) {
|
||||||
|
renderDropdownService(data.data);
|
||||||
|
},
|
||||||
|
error: function () {
|
||||||
|
console.error("请求失败");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}, 200); // 500 毫秒防抖
|
||||||
|
});
|
||||||
|
|
||||||
|
// 渲染城市下拉选项
|
||||||
|
function renderDropdownService(data) {
|
||||||
|
$dropdownService.empty(); // 清空列表
|
||||||
|
if (data.length === 0){
|
||||||
|
let $option = $("<li class='dropdown-item'></li>")
|
||||||
|
.text('未搜索到结果')
|
||||||
|
.attr("data-value", 0);
|
||||||
|
$dropdownService.append($option);
|
||||||
|
}else{
|
||||||
|
data.forEach(item => {
|
||||||
|
let $option = $("<li class='dropdown-item'></li>")
|
||||||
|
.text(item.merge_name)
|
||||||
|
.attr("data-value", item.area_code) // 绑定 area_code
|
||||||
|
.on("click", function () {
|
||||||
|
$inputService.val(item.merge_name); // 选中后填充输入框
|
||||||
|
$hiddenFieldService.val($(this).attr("data-value")); // 存储 area_code
|
||||||
|
$dropdownService.hide();
|
||||||
|
});
|
||||||
|
$dropdownService.append($option);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
$dropdownService.show(); // 显示下拉框
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// 点击外部隐藏下拉框
|
||||||
|
$(document).on("click", function (e) {
|
||||||
|
if (!$(e.target).closest("#c-address, #address-list").length) {
|
||||||
|
$dropdown.hide();
|
||||||
|
}
|
||||||
|
});
|
||||||
return Controller;
|
return Controller;
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user